【数学】找出若干个有序数组的最小距离
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]排序,最大值减最小值。
题目中要求的是三个有序数组,代码里扩展成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]]); } }
相关文章推荐
- 找出有序数组中绝对值最小的数
- 找出有序数组中绝对值最小的数
- 找出有序数组中的绝对值的最小值
- PHP实现找出有序数组中绝对值最小的数算法分析
- 找出有序数组中绝对值最小的元素
- 【算法】找出有序数组中,绝对值最小的一个(二分法)
- 找出有序数组中绝对值最小的元素
- 找出有序数组中绝对值最小的数
- 找出有序数组中绝对值最小的数
- 有一个数组内放10个整数要求找出最小的数&它的下标然后将它&数组中最前面的元素对换
- 两个有序数组,A[k]和B[k]长度都为k。求前k个最小的(a[i]+b[j])
- 14、一棵排序二叉树,令 f=(最大值+最小值)/2, 设计一个算法,找出距离f值最近、大于f值的结点。
- 给定一个数组,找出不在数组中的最小的那个数字
- 两个数组分别取出一个来相加,找出和最小的k个
- O(lgn)时间内找出有序数组中某个元素出现的次数
- 有序数组最小绝对值。
- 一棵排序二叉树,令 f=(最大值+最小值)/2,设计一个算法,找出距离f值最近、大于f值的结点。复杂度如果是O(n2)则不得分。
- 一棵排序二叉树,令 f=(最大值+最小值)/2,设计一个算法,找出距离f值最近、大于f值的结点。 复杂度如果是O(n2)则不得分。
- 找出无序数组中最小的前k个数
- 两数组最小距离问题