有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;
}
}
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 20
YunPair** 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;
}