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.
The subarray should contain at least one number
For [1, 2, -3, 1], return 6
O(n) time and O(n) space.
思路很簡單,寫起來很煩躁。分別左右兩邊求連續最大最小值,相當於把maximum subarray寫四遍。。。然後比較leftMax-rightMin vs rightMax - leftMin
public int maxDiffSubArrays(ArrayList<Integer> nums) {
int max = Integer.MIN_VALUE;
if (nums.size() <2) {
return 0;
}
int n = nums.size();
int[] leftMax = new int[n], leftMin = new int[n],
int localMax = 0; int localMin = 0;
for (int i = 0; i < n; i++) {
int num = nums.get(i);
localMax = Math.max(num + localMax, num);
localMin = Math.min(num + localMin, num);
if (i == 0) {
leftMax[i] = localMax;
leftMin[i] = localMin;
} else {
leftMax[i] = Math.max(localMax, leftMax[i-1]);
leftMin[i] = Math.min(localMin, leftMin[i-1]);
}
}
localMax = 0; localMin = 0;
int lastMax = 0, lastMin = 0;
for (int i = n-1; i > 0; i--) {
int num = nums.get(i);
localMax = Math.max(num + localMax, num);
localMin = Math.min(num + localMin, num);
if (i == n-1) {
lastMax = localMax;
lastMin = localMin;
} else {
lastMax = Math.max(localMax, lastMax);
lastMin = Math.min(localMin, lastMin);
}
max = Math.max(Math.max(Math.abs(leftMax[i-1]-lastMin),
Math.abs(lastMax - leftMin[i-1])), max);
}
return max;
}