用C++找出数组中所有元素对之间第k个最小差异的程序
假设我们得到一个包含几个整数的列表。我们必须找出数组中每对值之间的差异,并找出第k个最小的差异数。索引从0开始,值k作为输入提供给我们。
因此,如果输入类似于numbers={2,6,4,8},k=2,那么输出将为2。
对之间的差异是-
(2,6)=4
(2,4)=2
(2,8)=6
(6,4)=2
(6,8)=2
(4,8)=4
如果我们对值进行排序,它会变成2,2,2,4,4,6。第二个最小值是2。(索引从0开始)。
示例
让我们看看以下实现以获得更好的理解-
#include<bits/stdc++.h> using namespace std; int solve(vector<int>& input, int k) { k++; sort(input.begin(), input.end()); int le = 0; int ri = input.back() - input[0]; while (le < ri) { int mid = (le + ri) / 2; long long tmp = 0; int lp = 0; for (int i = 1; i < input.size(); i++) { while (input[i] - input[lp] > mid) lp++; tmp += i - lp; } if (tmp >= k) ri = mid; else le = mid + 1; } return le; } int main() { vector<int> numbers = {2, 6, 4, 8}; cout<< solve(numbers, 2) <<endl; return 0; }
输入
vector<int> numbers = {2, 6, 4, 8}; cout<< solve(numbers, 2) <<endl;输出结果
2