java - 最大平均数
问题描述
问题陈述:
我们将一行数字 A 划分为最多 K 个相邻(非空)组,然后我们的分数是每个组的平均值之和。我们能达到的最大分数是多少?
请注意,我们的分区必须使用 A 中的每个数字,并且分数不一定是整数。
我特别想了解 set generation 背后的方法。考虑以下示例数组。
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;
}
解决方案
您实际上并不需要涵盖最大为 3 的所有可能设置,因为您将ALWAYS
希望使用可用的最大组数(假设所有值都是正数)。
假设组大小为k
并且您找到了组的最佳答案k-1
。如果您选择其中一个组,从中取最高值并将其放入自己的组中,那么您将获得更高或相等的分数,因此您的答案并不是最佳的。(n 个数字的平均值永远不会高于这些数字中的最大值)
推荐阅读
- javascript - `TypeError:无法读取未定义的属性'ballDepth'
- php - PHP重定向仅适用于每隔一个页面
- csv - 在 CSV 中没有尾随逗号的情况下,gnu-parallel 不起作用
- algorithm - 算法问题:迭代多个时间序列“as of”
- xml - 有没有办法在 XPath 中指定最低的祖先?
- bash - “-bash: [git: command not found” 在 mac 上的 bash 脚本中
- html - 具有奇偶内容的 Flexbox 居中 div
- java - 持久化关联实体时违反休眠约束
- clone - 在 love2d 中克隆一个夹具
- here-api - HERE 地图:缓存地理编码结果