Maximum Subarray Difference

LintCode-45.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) {
        if (nums == null || nums.length == 0) {
            return 0;
        }
        
        int[] leftMin = new int[nums.length];
        leftMin[0] = nums[0];
        int minSum = nums[0];
        
        int[] leftMax = new int[nums.length];
        leftMax[0] = nums[0];
        int maxSum = nums[0];
        
        for (int i = 1; i < nums.length; i++) {
            minSum = Math.min(minSum + nums[i], nums[i]);
            leftMin[i] = Math.min(minSum, leftMin[i - 1]);

            maxSum = Math.max(maxSum + nums[i], nums[i]);
            leftMax[i] = Math.max(maxSum, leftMax[i - 1]);
        }
        
        int[] rightMin = new int[nums.length];
        rightMin[nums.length - 1] = nums[nums.length - 1];
        minSum = nums[nums.length - 1];
        
        int[] rightMax = new int[nums.length];
        rightMax[nums.length - 1] = nums[nums.length - 1];
        maxSum = nums[nums.length - 1];
        
        for (int i = nums.length - 2; i >= 0; i--) {
            minSum = Math.min(minSum + nums[i], nums[i]);
            rightMin[i] = Math.min(minSum, rightMin[i + 1]);
            
            maxSum = Math.max(maxSum + nums[i], nums[i]);
            rightMax[i] = Math.max(maxSum, rightMax[i + 1]);
        }
        
        int maxDiff = 0;
        for (int i = 0; i < nums.length - 1; i++) {
            maxDiff = Math.max(maxDiff, Math.max(Math.abs(leftMax[i] - rightMin[i + 1]), Math.abs(leftMin[i] - rightMax[i + 1])));
        }
        
        return maxDiff;
    }
}

Hope this helps,
Michael

DigitalOcean Referral Badge