查找单位数值数组的N个最大元素的总和

时间:2011-07-05 18:14:52

标签: algorithm

  

可能重复:
  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个最大元素的总和。但我不想用它

4 个答案:

答案 0 :(得分:8)

最简单的O(n)解决方案如下:

  1. 运行数组a并增加b[a[i]],其中b是10个整数的零初始化数组。
  2. 从结尾(9 th 位置)开始运行b,如果b[i]低于N,则将b[i] * i添加到您的答案中,然后按N减少b[i],否则b[i]大于或等于NN * i添加到答案和循环中。
  3. 修改: 代码

    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 sortbucket 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)时间内运行。