~ read.

# 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