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

来源:互联网 发布:纯爱社区 域名 编辑:程序博客网 时间:2024/05/16 17:13

题目: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;elsereturn 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的每一个数组的第一个数初始化setfor (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;//更新resint 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]]);}}



0 0
原创粉丝点击