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

有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 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;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值