数组中的Kth和

时间:2015-03-31 23:26:16

标签: c++ arrays search sum binary-search

我有一个包含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];

1 个答案:

答案 0 :(得分:0)

我从谷歌面试问题中看到了一个类似的问题,他们使用两个排序的数组而不是一个,但解决方案是有效的。可以在这里给出一个可以在O(klogk)中工作的优化。 要在这种情况下找到最大值,有必要计算所有小于它的值,即让i,j成为您5,5中要考虑5,5的最大值4,5最大值有必要同时评估5,4i-1,ji,j-1heap所以一个工作代码将在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)