可能重复:
Retrieving the top 100 numbers from one hundred million of numbers
我有一个数组,其中包含0到9之间的正数,(数字可以重复)。我想找到N个最大元素的总和
For example array = 5 1 2 4 and N=2
ans = 5+4 = 9
简单方法:排序数组并找到n个最大元素的总和。但我不想用它
答案 0 :(得分:8)
最简单的O(n)解决方案如下:
a
并增加b[a[i]]
,其中b
是10个整数的零初始化数组。b
,如果b[i]
低于N
,则将b[i] * i
添加到您的答案中,然后按N
减少b[i]
,否则b[i]
大于或等于N
将N * i
添加到答案和循环中。修改: 代码
vector<int> b(10, 0);
for(int i = 0; i < a.size(); ++i) {
b[a[i]]++;
}
int sum = 0;
for(int i = 9; i >= 0; --i) {
if(b[i] < n) {
sum += b[i] * i;
n -= b[i];
} else {
sum += n * i;
n = 0;
break;
}
}
if(n != 0) {
// no enough element in the array
}
答案 1 :(得分:1)
将全部插入heap,然后删除(和求和)N个元素。
复杂性:O(n+Nlogn)
,因为创建堆是O(n),每次删除都是O(logn),并且迭代重复删除N次。 total:O(n + Nlogn)[其中n是数组中元素的数量]。
编辑:我最初错过了,但你的所有数字都是数字。所以最简单的解决方案是使用radix sort或bucket sort,然后对N个最大元素求和。解决方案是O(n)。
答案 2 :(得分:0)
今天我有点慢,应该编码更快嘿嘿; - )
已经有多个答案,但无论如何我想与你分享我的伪代码,希望它有所帮助!
public class LargestSumAlgorithm
{
private ArrayList arValues;
public void AddValueToArray(int p_iValue)
{
arValues.Add(p_iValue);
}
public int ComputeMaxSum(int p_iNumOfElementsToCompute)
{
// check if there are n elements in the array
int iNumOfItemsInArray = arValues.Size;
int iComputedValue = 0;
if(iNumOfItemsInArray >= p_iNumOfElementsToCompute)
{
// order the ArrayList ascending - largest values first
arValues.Sort(SortingEnum.Ascending);
// iterate over the p_iNumOfElementsToCompute in a zero index based ArrayList
for(int iPositionInValueArray = 0; iPositionInValueArray < p_iNumOfElementsToCompute); iPositionInValueArray++)
{
iComputedValue += arValues[i];
}
}
else
{
throw new ArgumentOutOfRangeException;
}
return iComputedValue;
}
public LargestSumAlgorithm()
{
arValues = new ArrayList();
}
}
public class Example
{
LargestNumAlgorithm theAlgorithm = new LargestSumAlgorithm();
theAlgorithm.AddValueToArray(1);
theAlgorithm.AddValueToArray(2);
theAlgorithm.AddValueToArray(3);
theAlgorithm.AddValueToArray(4);
theAlgorithm.AddValueToArray(5);
int iResult = theAlgorithm.ComputeMaxSum(3);
}
答案 3 :(得分:-1)
如果您使用的是C ++,请使用std :: nth_element()将数组分成两组,其中一组包含N个最大元素(无序)。选择算法在O(n)时间内运行。