数组中的Kth和

问题描述 投票:1回答:1

我有一个包含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];
c++ arrays search sum binary-search
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.