Algorithm 求单位数值数组的N个最大元素之和
可能重复:Algorithm 求单位数值数组的N个最大元素之和,algorithm,Algorithm,可能重复: 我有一个数组,它由0到9之间的正数组成(数字可以重复)。我想求N个最大元素的和 For example array = 5 1 2 4 and N=2 ans = 5+4 = 9 简单的方法:对数组排序并找到n个最大元素的和。但我不想使用它将所有元素插入到a中,然后删除(和)N个元素。 复杂性:O(n+Nlogn),因为创建堆是O(n),每次删除都是O(logn),并且在delete上迭代n次。总数:O(n+Nlogn)[其中n是数组中的元素数] 编辑:起初我没看到,但你的号码
我有一个数组,它由0到9之间的正数组成(数字可以重复)。我想求N个最大元素的和
For example array = 5 1 2 4 and N=2
ans = 5+4 = 9
简单的方法:对数组排序并找到n个最大元素的和。但我不想使用它将所有元素插入到a中,然后删除(和)N个元素。
复杂性:
O(n+Nlogn)
,因为创建堆是O(n),每次删除都是O(logn),并且在delete上迭代n次。总数:O(n+Nlogn)[其中n是数组中的元素数]
编辑:起初我没看到,但你的号码都是数字。因此,最简单的解决方案是使用或,然后对N个最大元素求和。溶液为O(n)。最简单的O(n)溶液如下:
a
并递增b[a[i]
,其中b
是一个由10个整数组成的零初始化数组b
,如果b[i]
低于N
则将b[i]*i
添加到您的答案中,然后将N
减少b[i]
,否则如果b[i]
大于或等于N
则将N*i
添加到答案中并通过循环向量b(10,0);
对于(int i=0;i=0;--i){
if(b[i]
我今天有点慢,应该快一点,呵呵;-)
已经有多个答案了,但我还是想和你们分享我的伪代码,希望它能有所帮助
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);
}
公共类最大值算法
{
私有数组列表值;
公共无效附加值阵列(国际比武)
{
arValues.Add(p_iValue);
}
公共整数计算axsum(整数p_iNumOfElementsToCompute)
{
//检查数组中是否有n个元素
int iNumOfItemsInArray=arValues.Size;
int iComputedValue=0;
if(iNumOfItemsInArray>=p_iNumOfElementsToCompute)
{
//将ArrayList按升序排列-先排列最大值
arValues.Sort(SortingEnum.升序);
//在基于零索引的ArrayList中迭代p_iNumOfElementsToCompute
对于(int-ipositionvaluearray=0;ipositionvaluearray <代码> > p>如果使用C++,则使用STD::NthyEnEntEnter()将数组划分为两组,其中一组包含n个最大元素(无序)。选择算法以O(n)时间运行 插入BST,然后向左遍历右根,每次递减N,直到到达0@akshay:插入排序树需要一个排序,它将是O(nlogn),值为O(n+nlogn)@akshay的排序解决方案更好。@Mihran:它为N@amit和Mihran带来了值得的性能:所以我可以说排序方法比BST更好,BST比ur heap方法+1更好。我的解决方案没有利用所有元素都是0-9这一事实,所以基数排序(即O(n))就可以了。我认为元素在0到9之间的限制使得它不是一个紧密的重复。这里有更有效的答案,利用了有限的范围。由于限制,这不是另一个问题的重复。提问者正在寻找解决问题的更好方法。“使用C++”不是一个真正的答案,尤其是考虑到他没有用C++来标注他的问题。
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);
}