我们将数字A的行划分为最多K个相邻的(非空) 组,那么我们的分数就是每个组的平均值之和。什么 能达到的最高分数是什么?
请注意,我们的分区必须使用A中的每个数字,并且得分 不一定是整数。
我专门试图了解集合生成背后的方法。考虑下面的示例数组。
N = 5,元素:[9,1,2,3,9,8]
k = 3
问题要求生成最大为k的步长。例如,我们可以具有以下生成的集合(尽管实际集合会更大)。
- [9,1,2]和[3,9,8]
- [9],[1,2,3],[9、8]
- [9,1,2],[3],[9、8]
我试图理解没有记忆的幼稚递归解决方案。
问题:
我添加了日志以了解如何生成这些集合。我无法 理解如何使用来生成集合[9,1,2] [3,9,8] 以下代码段。更重要的是,它如何涵盖所有内容 可能的设置最大为3。
public double largestSumOfAverages(int[] arr, int groupSize) {
int[] sum = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
sum[i] = arr[i] + (i > 0 ? sum[i - 1] : 0);
}
System.out.println(Arrays.toString(sum));
return dfs(arr, groupSize, sum, arr.length, 0);
}
public double dfs(int[] arr, int groupSize, int[] sumToIthIndex, int right, int left) {
if (groupSize == 1) {
double avg1 = ((double) (sumToIthIndex[right - 1] - sumToIthIndex[left] + arr[left]) / (right
- left));
System.out.println(" dfs return :: " + left + " right:: " + right + " :grpSize:: " + groupSize);
return avg1;
}
double num = 0;
for (int index = left; index + groupSize <= right; index++) {
System.out.println(" dfs left:: " + index + " right:: " + right + " :grpSize:: " + groupSize);
num = Math.max(num,
((double) (sumToIthIndex[index] - sumToIthIndex[left] + arr[left]) / (index - left
+ 1)) + dfs(arr, groupSize - 1, sumToIthIndex, right,index + 1));
}
System.out.println("End");
return num;
}
答案 0 :(得分:1)
您实际上并不需要涵盖所有大小最大为3的设置,因为您将ALWAYS
要使用给您可用的最大组数(假设所有值都是正数)。
假设组的大小为k
,并且找到了k-1
个组的最佳答案。如果您选择这些组中的一个,则从中获得最高的价值并将其放入自己的组中,那么您将获得更高或相等的分数,因此您的答案并不是真正的最佳选择。 (n个数字的平均值永远不会高于这些数字中的最大数字)
答案 1 :(得分:0)
我不了解该算法,但是我想做的就是尝试用我的头做示例,以了解代码的工作原理。 在这里,我进行了循环的第一次迭代:
FIRST ITERATION
1) groupeSize = 3, right = 6, left = 0, index = 0,
num = max(0, ((9 - 9 + 9) / 1) + <5.5>)) = 14.5
2) groupeSize = 2, right = 6, left = 1, index = 0,
num1 = max(0, ((9 - 10 + 1 / (0 - 1 + 1)) + <5.5>)) = 5.5
3) groupeSize = 1, right = 6, left = 2, index = 0, avg1 = ((32 - 12 + 2) / (6-2)) = 5.5
对应于[9,1,2], [3], [9, 8]
的平均值之和
每个1),2),...是一个递归,<>
之间的所有值都是相反的顺序(从递归返回时)
尝试继续理解!祝你好运!