假设我们有一个包含多个整数的列表。我们必须找出数组中每对值之间的差异,并找出第 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)。
为了解决这个问题,我们将按照以下步骤操作 -
将 k 增加 1对数组输入进行排序le := 0ri := 输入的最后一个元素 - 输入的第一项while le mid := (le + ri) / 2tmp := 0lp := 0用于初始化 i := 1 ,当 i while input[i] - input[lp] > mid,执行 −lp := lp + 1tmp := tmp + i - lp如果tmp >= k,则 -ri := mid否则le := mid + 1返回le示例令我们看下面的实现来更好地理解 -
#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;elsele = 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
以上就是用c++编写一个程序,找出数组中所有元素对之间第k小的差值的详细内容。