给定几个列表/整数数组。需要找出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代码。
答案 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值。只要你没有被美丽评分。