题目描述
给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大。
返回这个最大的差值。
样例1
输入:[1, 2, -3, 1]
输出:6
解释:
子数组是 [1,2] 和[-3].所以答案是 6.
样例2
输入:[0,-1]
输出:1
解释:
子数组是 [0] 和 [-1].所以答案是 1.
java题解
dp。
维护四个数组,当前位置左边的最大子数组和,最小子数组和。当前位置右边的最大子数组和,最小子数组和。
然后枚举分割线,扫描一下即可。
public class Solution {
public int maxDiffSubArrays(int[] nums) {
// write your code here
int size = nums.length;
int[] left_max = new int[size];
int[] left_min = new int[size];
int[] right_max = new int[size];
int[] right_min = new int[size];
int[] copy = new int[size];
/*Get negative copy*/
for(int i = 0; i < size; i++){
copy[i] = -1 * nums[i];
}
int max = Integer.MIN_VALUE;
int sum = 0;
int minSum = 0;
/*Forward: get max subarray*/
for(int i = 0; i < size; i++){
sum += nums[i];
max = Math.max(max, sum - minSum);
minSum = Math.min(sum, minSum);
left_max[i] = max;
}
/*Backward: get max subarray*/
max = Integer.MIN_VALUE;
sum = 0;
minSum = 0;
for(int i = size - 1; i >= 0; i--){
sum += nums[i];
max = Math