lintcode-medium-Maximum Subarray Difference

Given an array with integers.

Find two non-overlapping subarrays A and B, which |SUM(A) - SUM(B)|is the largest.

Return the largest difference.

 

Notice

The subarray should contain at least one number

Example

For [1, 2, -3, 1], return 6.

Challenge

O(n) time and O(n) space.

 

public class Solution {
    /**
     * @param nums: A list of integers
     * @return: An integer indicate the value of maximum difference between two
     *          Subarrays
     */
    public int maxDiffSubArrays(int[] nums) {
        // write your code here
        
        if(nums == null || nums.length == 0)
            return 0;
        
        int size = nums.length;
        
        int sum_max = nums[0];
        int[] l2r_max = new int[size];
        l2r_max[0] = nums[0];
        int sum_min = nums[0];
        int[] l2r_min = new int[size];
        l2r_min[0] = nums[0];
        
        for(int i = 1; i < size; i++){
            if(sum_max < 0)
                sum_max = 0;
            sum_max += nums[i];
            
            if(sum_max > l2r_max[i - 1])
                l2r_max[i] = sum_max;
            else
                l2r_max[i] = l2r_max[i - 1];
                
            if(sum_min > 0)
                sum_min = 0;
            sum_min += nums[i];
            
            if(sum_min < l2r_min[i - 1])
                l2r_min[i] = sum_min;
            else
                l2r_min[i] = l2r_min[i - 1];
        }
        
        sum_max = nums[size - 1];
        int[] r2l_max = new int[size];
        r2l_max[size - 1] = nums[size - 1];
        sum_min = nums[size - 1];
        int[] r2l_min = new int[size];
        r2l_min[size - 1] = nums[size - 1];
        
        for(int i = size - 2; i >= 0; i--){
            if(sum_max < 0)
                sum_max = 0;
            
            sum_max += nums[i];
            
            if(sum_max > r2l_max[i + 1])
                r2l_max[i] = sum_max;
            else
                r2l_max[i] = r2l_max[i + 1];
            
            if(sum_min > 0)
                sum_min = 0;
            sum_min += nums[i];
            
            if(sum_min < r2l_min[i + 1])
                r2l_min[i] = sum_min;
            else
                r2l_min[i] = r2l_min[i + 1];
        }
        
        int result = Integer.MIN_VALUE;
        for(int i = 0; i < size - 1; i++){
            result = Math.max(result, Math.max(Math.abs(l2r_min[i] - r2l_max[i + 1]), Math.abs(l2r_max[i] - r2l_min[i + 1])));
            result = Math.max(result, Math.max(Math.abs(l2r_max[i] - r2l_max[i + 1]), Math.abs(l2r_min[i] - r2l_min[i + 1])));
        }
            
        return result;
    }
}

 

posted @ 2016-03-30 12:52  哥布林工程师  阅读(154)  评论(0编辑  收藏  举报