数组中的第K个和

Kth sum in an array

本文关键字:个和 数组      更新时间:2023-10-16

我有一个有n个元素的数组,我需要计算两个元素对(array[I]+array[j])的所有n*n和。所有和都按升序排列。我需要找到Kth sum

例如:

array[]={3,4,5}

所有和:{(3+3),(3+4),(4+3)

K=6

我需要找到第K个和的值(在这种情况下,第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];

我在谷歌面试中看到过类似的问题,他们使用两个排序的数组而不是一个,但解决方案有效。这里可以给出一个将在CCD_ 1中工作的优化。在这种情况下,要找到最大值,必须计算出所有小于它的值,即让i,j是最大值,在5,5的情况下,5,5是最大值。必须同时计算4,55,4。即i-1,ji,j-1。因此,工作代码是在c++中使用heap,它是O(klogk)0。代码如下

#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)。你可以在这里找到它。O(k)中的第k个和