Maximum Average Subarray

Important Reference:

http://stackoverflow.com/questions/13093602/finding-subarray-with-maximum-sum-number-of-elements

http://www.jiuzhang.com/qa/2942/

public class Solution {
    /**
     * @param nums an array with positive and negative numbers
     * @param k an integer
     * @return the maximum average
     */
    public double maxAverage(int[] nums, int k) {
        // Write your code here
        double l = Integer.MAX_VALUE;
        double r = Integer.MIN_VALUE;
        
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] < l) {
                l = nums[i];
            } 
            if (nums[i] > r){
                r = nums[i];
            }
        }
        
        while (r -l > 1e-6) {
            double mid = l + (r - l) / 2.0;
            if (valid(nums, mid, k)) { //TODO
                l = mid;
            } else {
                r = mid;
            }
        }
        return l;
    }
    
    private boolean valid(int nums[], double mid, int k) {
        int n = nums.length;
        double[] sum = new double[n + 1];
        sum[0] = 0.0;
        double minPre = 0.0;
        for (int i = 1; i < n + 1; i++) {
            sum[i] = sum[i - 1] + nums[i - 1] - mid; //nums[i - 1] because i start with 1, eg. sum[3] means from nums[0] ~ nums[2]
            if (i >= k && sum[i] - minPre >= 0) {
                return true;
            }
            
            if (i >= k) {
                minPre = Math.min(minPre, sum[i - k + 1]);
            }
        }
        return false;
    }
}

 

posted on 2017-05-11 04:43  codingEskimo  阅读(115)  评论(0)    收藏  举报

导航