您的位置:首页 > 其它

【数学】找出若干个有序数组的最小距离

2015-01-18 19:26 155 查看
题目:EPI



题目中要求的是三个有序数组,代码里扩展成k个有序数组,其中k是函数输入的数组的size。

题目的意思可简化为:从A中的每个数组里选出一个数,则一共有k个数。这k个数从小到大排序(存放在set里,其实就是排序了),设最大的数减去最小的数,值为distance。我们要做的就是令distance尽可能小。所以每次更新res时,就需要把k个数中的最小值变大(即在其数组中右移一位),这样res才有可能变小。

本题难点在于理解书上题目中max( |A[i]-B[j]| , |A[i]-C[k]| , |B[j]-C[k]| )这个数,其实就是把A[i]、B[j]、C[k]排序,最大值减最小值。

class ArrayData
{
public:
	int id;//记录属于题目A中第几个数组,A[id]
	int value;//数组A[id]中被放在numbers中的那个数
	const bool operator < (const ArrayData &a)const//为set的排序服务
	{
		if (value != a.value)
			return value < a.value;
		else
			return id < a.id;
	}
};

int find_min_distance(const vector<vector<int>> &A)
{
	if (A.empty())
		throw new exception;
	unsigned int res = 0xffffffff;
	vector<int> id(A.size(),0);//id[i],意味着A[i][id[i]]被放在numbers里
	set<ArrayData> numbers;//默认从小到大排列,这个很关键,记录当前被比较的数

	//用A的每一个数组的第一个数初始化set
	for (int i = 0; i < A.size(); i++)
	{
		if (id[i] >= A[i].size())//如果某个数组是空的
			return res;
		numbers.emplace(i, A[i][id[i]]);
	}

	while (true)
	{
		auto iter = numbers.end()--;//指向numbers里最后一个数,也就是最大那个数
		res = res> iter->value - numbers.begin()->value ? iter->value - numbers.begin()->value : res;//更新res
		int index = numbers.begin()->id;
		++id[index];
		if (id[index] >= A[index].size())
			return res;
		numbers.erase(numbers.begin());
		numbers.emplace(index, A[index][id[index]]);
	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: