查找包含有序链表元素最小取值范围SearchMinPair

来源:互联网 发布:淘宝违规出售假冒商品 编辑:程序博客网 时间:2024/05/29 15:29
有k个有序的链表,请编写一个函数找到一个Pair满足以下条件:
1. 每个链表都至少有一个数包含在Pair范围内;
2. 这个Pair所表示的范围是所有满足条件的Pair中最小的
例如,
k = 3
List 1: [5, 8, 15, 25, 36]
List 2: [0, 4, 18, 50, 100]
List 3: [3, 7, 20, 30, 45]
返回的Pair是(3, 5),范围为2,List1中的5、List2中的4、List3中的3在这个Pair表示的范围内。
请注意:先写下您的思路,然后提供代码或伪代码

算法思想描述:
假定现在有链表序列List1、List2、List3......ListK
(1)将List1,List2,List3......ListN的头结点放在一起,构造为pair[0],找出对应的最大与最小值 
pMax, pMin分表指向对应的链表节点
pair[index]->left = pMin->value;
pair[index]->right = pMax->value;
pair[index]->range = pair[index]->right - pair[index]->left;
int min_range = pair[index++]->range;

(2)while(K条链有一条还没结束){
将pMin指向位置后移
if(pMin->value = pa->value)
{
pa = pa->next;
}t,构造出Pair[i+1]参照(1)找出 pMax, pMin, 

pMin = min(pa, pb, pc);
pMax = max(pa, pb, pc);

if(( pMax->value - pMin->value) < min_range )
{
pair[index]->left = pMin->value;
pair[index]->right = pMax->value;

pair[index]->range = pair[index]->right - pair[index]->left;
min_range = pair[index++]->range;
}
}

(3)输出pair[index-1]的元素及范围


初步代码实现

/** * SearchMinPair(List list[], int k)* @author arhaiyun * Date : 2013-12-26* **/  #include "stdafx.h"#include <iostream>#include <fstream>#include <stdio.h>using namespace std;typedef struct list{int value;struct list* next;}LinkList,*List;typedef struct pair{int left;int right;int range;}YunPair,*Pair;List min(List pa, List pb, List pc){List ret = pa->value < pb->value ? pa : pb;ret = ret->value < pc->value ? ret : pc;return ret;}List max(List pa, List pb, List pc){List ret = pa->value > pb->value ? pa : pb;ret = ret->value > pc->value ? ret : pc;return ret;}void SearchMinPair(List list[], int k){//-存在隐患 采用vector 链表等动态可扩展的方式,而不是设定为hard code 20YunPair**  pair = new Pair[20];for(int i = 0; i < 20; i++) //如此定义时候的初始化{pair[i] = new YunPair();}List pa = list[0];List pb = list[1]; List pc = list[2];List pMin = min(pa, pb, pc);List pMax = max(pa, pb, pc);int index = 0;pair[index]->left = pMin->value;pair[index]->right = pMax->value;pair[index]->range = pair[index]->right - pair[index]->left;int min_range = pair[index++]->range;//-可以扩展到三条以上的链表模式while(pa != NULL && pb != NULL && pc != NULL){if(pMin->value == pa->value){pa = pa->next;}else if(pMin->value == pb->value){pb = pb->next;}else{pc = pc->next;}//-防止循环条件中空指针的出现,对其进行判断if(pa == NULL || pb == NULL || pc == NULL){break;}pMin = min(pa, pb, pc);pMax = max(pa, pb, pc);//-最小范围得到更新,记录相应的取值if(( pMax->value - pMin->value) < min_range ){pair[index]->left = pMin->value;pair[index]->right = pMax->value;pair[index]->range = pair[index]->right - pair[index]->left;min_range = pair[index++]->range;}}cout<<"("<<pair[index-1]->left<<","<<pair[index-1]->right<<") range:"<<pair[index - 1]->range<<endl;}int main(int argc, char* argv[]){//-打开文件的方式进行数据的输入fstream fin("in.txt", ios::in);if(!fin) {cout<<"open input file error"<<endl;return 0;}List* pList= new List[3];List pNode;//-通过设定输入规则,构建初始化链表while(!fin.eof()){for(int i = 0; i < 3; i++){pList[i] = new LinkList();pList[i]->next = NULL;for(int j = 0; j < 5; j++){pNode = new LinkList();fin>>pNode->value;pNode->next = pList[i]->next;pList[i]->next = pNode;}pList[i] = pList[i]->next;}break;}SearchMinPair(pList,3);fin.close();delete[] pList;delete pNode;system("pause");return 0;}




0 0
原创粉丝点击