<分区>
Possible Duplicate:
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 个最大元素的总和。但是我不想用它
标签 algorithm
<分区>
Possible Duplicate:
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 个最大元素的总和。但是我不想用它
最佳答案
最简单的 O(n) 解决方案如下:
a
并增加b[a[i]]
其中 b
是 10 个整数的零初始化数组。b
从末尾开始(第 9 位置)并且如果 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
}
关于algorithm - 求个位数数组的 N 个最大元素的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6587021/