【发布时间】:2019-10-03 03:04:12
【问题描述】:
Q:给定n个整数,找到一个平均数最大且长度为k的连续子数组,并输出最大平均数。
输入:[1,12,-5,-6,50,3],k = 4
输出:12.75
例如:maxAvr (12-5-6+50)/4 = 51/4 = 12.75
class Solution {
public double findMaxAverage(int[] nums, int k) {
double[] f = new double[nums.length];//save the max value f[i] with range k from nums[]
int length = nums.length;
int sum = 0;
for (int i = 0; i < k; i++) {
sum += nums[i];
}
if (length == k) {
return ((double) sum / k);
}
f[k - 1] = (double)sum; // start at f[k-1]
for (int i = k - 1; i < length - 1; i++) {
f[i + 1] = f[i] - nums[i - k + 1] + nums[i + 1]; // with dp to find the maxValue in the range k
}
Arrays.sort(f);
return (double) f[length - 1] / (double) k;
}
}
调试
- ✘ 答案错误
- ✘ 测试用例:一个大数组,有 6514 个项目
- ✘ 通过了 118/123 个案例(不适用)
- ✘ 答案:
- ✘ 标准输出:'0.0'
调试的时候发现idea.sh解决不了大数组
【问题讨论】:
-
如果你能解释一下你的算法试图做什么,那将会很有用,那么也许你会明白为什么它可能效率低?
-
感谢@cricket_007,我会学习使用堆栈溢出
-
如果您对数组进行排序,您的解决方案不是线性时间...您不能只扫描数组以获得最大值吗? (这是我看到你排序的唯一原因)
-
你甚至不需要保存一个总数的数组;您只需要记住当前的最大值并将其替换为每个更大的新总数。 .此外,您可能想尝试使用
long而不是int来表示总数:如果他们给了您6514 个大于一百万的数字,您将溢出int的容量,大约是总数的1/3一路走来…… -
@cricket_007 是的,我解决了,只是因为 Arrays.sort() 。我把它贴在下面。