我有一个包含n个元素的数组,我需要计算两个元素对的所有n * n和(array [i] + array [j])。所有的和都按升序排列。我需要找到K和
例如:
array [] = {3,4,5}
所有金额:{(3 + 3),(3 + 4),(4 + 3),(3 + 5),(5 + 3),(4 + 4),(4 + 5),(5 + 4) ),(5 + 5)}
K = 6
我需要找到Kth sum的值(在这种情况下,第6个总和是4 + 4,我将返回8);
解决方案可能非常理想
这是我的解决方案;它不是最佳的:
for(i=0;i<n;i++)
fin>>a[i];
qsort(a, n, sizeof(int), int_cmp);
for(i=0;i<n;i++)
for(j=i;j<n;j++)
{
sum[k]=a[i]+a[j];
if(i!=j)
sum[++k]=a[i]+a[j];
k++;
}
qsort(sum, n*n, sizeof(int), int_cmp);
cout<<sum[nrs-1];
我从谷歌面试问题中看到了一个类似的问题,他们使用两个排序的数组而不是一个,但解决方案是有效的。可以在这里给出一个可以在O(klogk)
中工作的优化。要在这种情况下找到最大值,有必要计算所有小于它的值,即让i,j
为你的情况下5,5
的最大值,考虑5,5
为max,有必要对4,5
and和5,4
进行评估。是i-1,j
和i,j-1
因此,一个工作代码将使用c ++中的heap
它是一个priority queue
。代码如下
#include <iostream>
#include <queue>
using namespace std;
for(i=0;i<n;i++)
fin>>a[i];
qsort(a, n, sizeof(int), int_cmp);
std::priority_queue<int > heap;
heap.add(pair(n-1, n-1)); // biggest pair n=array size
// remove max k-1 times
for (int i = 0; i < k - 1; ++i) {
// get max and remove it from the heap
max = heap.pop();
// add next candidates
heap.push(pair(max.i - 1, max.j));
heap.push(pair(max.i, max.j - 1));
}
// get k-th maximum element
max = heap.pop();
maxVal = a[max.i] + a[max.j];
现在这个优化到O(k.logk)
还有另一个给O(k)
。你可以在这里找到它.Kth sum in O(k)