Maximum Average Subarray II

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;
    }
}

  

猜你喜欢

转载自www.cnblogs.com/FLAGyuri/p/12077420.html