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个整数组成的零初始化数组
  • 从末尾(第9位)开始运行
    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);
    }