从多个整数列表中查找K最高总和

时间:2014-01-16 03:39:26

标签: java arrays algorithm

给定几个列表/整数数组。需要找出K个最高和,从每个列表中只选择一个元素。每个列表/数组包含一个非递增序列的整数。

例如,给定输入:

[5,4,3,2,1]
[4,1]
[5,0,0]
[6,4,2]
[1] 

并且如果K的值是5,即5个最高总和。

结果将是:

[21,20,19,19,18]

输入法的示例可能如下所示:

List<Integer> fetchHighestSums(int[][] lists,int n){  }

有人可以帮助解决上面的java代码。

3 个答案:

答案 0 :(得分:2)

这有一个简单的贪心算法。将所有数字排序成一个数组,如P,用数组的信息标记每个数字。属于。 最初,总和将是每个数组中所有最高(第一)数的总和,并将这些no.s存储在另一个数组中。我们从P中删除这些数字。下一步将是替换其中一个数字从P.获得下一个最高数字的S.我们从P中选择下一个最高数字并删除相应的数字。从S并删除选定的否。来自P.我们这样做直到我们得到k最高的no.s或直到P为空。 例如,如果

A = [5,4,3,2,1]
B = [4,1]
C = [5,0,0]
D = [6,4,2]
E = [1] 

P = D[0] A[0] C[0] A[1] B[0] D[1] A[2] D[2] A[3] D[2] A[4] B[1] E[0] C[2]
S = D[0] + A[0] + C[0] + B[0] + E[0] and P = A[1] D[1] A[2] D[2] A[3] D[2] A[4] B[1] C[2]
S = D[0] + A[1] + C[0] + B[0] + E[0] and P = D[1] A[2] D[2] A[3] D[2] A[4] B[1] C[2]
S = D[1] + A[0] + C[0] + B[0] + E[0] and P = A[2] D[2] A[3] D[2] A[4] B[1] C[2]
S = D[0] + A[2] + C[0] + B[0] + E[0] and P = D[2] A[3] D[2] A[4] B[1] C[2]

...等

答案 1 :(得分:1)

首先,通过读取函数头,我认为它是一个2D数组,所以每个列表的长度 应该是相同的

List<Integer> fetchHighestSums(int[][] lists,int n){
    List<Integer> result = new ArrayList<Integer>();
    if(lists==null || lists.length==0 || lists[0].length==0){
        return result;
    }
    else if(n>lists[0].length*lists.length){
        return null;
    }
    else{
        int[] indexes = new int[lists.length];
        int sum = 0;
        int curMax = Integer.MIN_VALUE;
        int curMaxIndex = -1;
        for(int i=0; i<n; i++){
            sum = 0;
            curMax = Integer.MIN_VALUE;
            for(int j=0; j<lists.length; j++){
                sum += lists[j][indexes[j]];
                if(lists[j][indexes[j]]>curMax){
                    curMaxIndex = j;
                }
            }
            result.add(sum);
            indexes[curMaxIndex]++;
        }
    return result;
}

这最多是O(nm)时间,需要O(m)空间(m =列数和n =行数)

答案 2 :(得分:0)

有很多方法可以做到这一点,虽然我不确定你在课堂上学到了什么,他们希望你申请。对我来说,一些“更容易”的解决方案就是制作一个包含每个可能总和的数组,从每个列表中取一个...对它进行排序并获取第一个(或最后一个)N值。只要你没有被美丽评分。