我有一个包含n个元素的数组,我需要计算两个元素对的所有n * n和(array [i] + array [j])。所有的和都按升序排列。我需要找到Kth总和
例如:
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];
答案 0 :(得分:0)
我从谷歌面试问题中看到了一个类似的问题,他们使用两个排序的数组而不是一个,但解决方案是有效的。可以在这里给出一个可以在O(klogk)
中工作的优化。
要在这种情况下找到最大值,有必要计算所有小于它的值,即让i,j
成为您5,5
中要考虑5,5
的最大值4,5
最大值有必要同时评估5,4
和i-1,j
。i,j-1
和heap
所以一个工作代码将在c ++中使用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)
,还有另一个提供{{1}}。你可以在这里找到它。Kth sum in O(k)