Description
Given an array with positive and negative numbers, find the maximum average subarray
which length should be greater or equal to given length k
.
It's guaranteed that the size of the array is greater or equal to k.
Example
Example 1:
Input:
[1,12,-5,-6,50,3]
3
Output:
15.667
Explanation:
(-6 + 50 + 3) / 3 = 15.667
Example 2:
Input: [5] 1 Output: 5.000
思路:二分答案
二分出 average 之后,把数组中的每个数都减去 average,然后的任务就是去求这个数组中,是否有长度 >= k 的 subarray,他的和超过 0。
这一步用类似 Maximum Subarray 的解法来做就好了
public class Solution { /** * @param nums: an array with positive and negative numbers * @param k: an integer * @return: the maximum average */ private boolean canFind(int[] nums, int k, double avg) { double rightSum = 0, leftSum = 0, minLeftSum = 0; for (int i = 0; i < k; i++) { rightSum += nums[i] - avg; } for (int i = k; i <= nums.length; i++) { if (rightSum - minLeftSum >= 0) { return true; } if (i < nums.length) { rightSum += nums[i] - avg; leftSum += nums[i - k] - avg; minLeftSum = Math.min(minLeftSum, leftSum); } } return false; } public double maxAverage(int[] nums, int k) { double start, end, mid; start = end = nums[0]; for (int i = 0; i < nums.length; i++) { start = Math.min(nums[i], start); end = Math.max(nums[i], end); } while (start + 1e-5 < end) { mid = (start + end) / 2; if (canFind(nums, k, mid)) { start = mid; } else { end = mid; } } return start; } }