【问题标题】:Kth sum in an array数组中的第 K 个和
【发布时间】:2015-06-05 11:29:14
【问题描述】:

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

例如:

数组[] = {3,4,5}

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

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];

【问题讨论】:

  • 那么问题出在哪里?你写了什么代码?
  • 我需要一个想法来实现这个。我已经实现了,但效率低下
  • 如果您发布了代码,也许我们可以帮助您改进它。我不知道这个网站上是否有人会花时间为你写,虽然看起来并不难。
  • 我解决了这个问题,但效率低下。我需要一个想法
  • 我不需要实现。我想要一个想法或一个简单的算法

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


【解决方案1】:

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

【讨论】:

  • 非常感谢这个想法。但我仍然有一个问题。我有一些错误:1)错误:'struct std::greater'中没有​​名为'value_type'的类型2)错误:模板参数 3 无效|我想我必须添加一个库或其他东西
  • 我在代码中添加了必要的修改。这是关于图书馆或更确切地说是 STL
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-13
  • 2021-12-24
  • 2014-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多