lintcode-子数组的最大平均值 II
一.题目描述
给出一个整数数组,有正有负。找到这样一个子数组,他的长度大于等于 k,且平均值最大。
二.代码
public double maxAverage(int[] nums, int k) { double left = Double.MAX_VALUE; double right = Double.MIN_VALUE; for (int num : nums) { left = Math.min(num, left); right = Math.max(num, right); } while (left + 0.00001 < right) { double mid = (left + right) / 2; if (check(nums, k, mid)) { left = mid; } else { right = mid; } } return left; } private boolean check(int[] nums, int k, double avg) { double rightSum = 0, leftSum = 0, minLeftSum = 0; for (int i = 0; i < k; i++) { rightSum += nums[i] - avg; } if (rightSum >= 0) { return true; } for (int i = k; i < nums.length; i++) { rightSum += nums[i] - avg; leftSum += nums[i - k] - avg; minLeftSum = Math.min(minLeftSum, leftSum); if (rightSum >= minLeftSum) { return true; } } return false; }
下一篇:
Java研发岗必背算法82道