45. 最大子数组差
给定一个整数数组,找出两个
不重叠
的子数组A和B,使两个子数组和的差的绝对值
|SUM(A) - SUM(B)|
最大。
返回这个最大的差值。
样例
例1:
输入:[1, 2, -3, 1]
输出:6
解释:
子数组是 [1,2] 和[-3].所以答案是 6.
例2:
输入:[0,-1]
输出:1
解释:
子数组是 [0] 和 [-1].所以答案是 1.
挑战
时间复杂度为O(n),空间复杂度为O(n)
注意事项
子数组最少包含一个数
public class Solution {
/**
* @param nums: A list of integers
* @return: An integer indicate the value of maximum difference between two substrings
*/
public int maxDiffSubArrays(int[] nums) {
int i = 0, j = nums.length - 1;
int[][] dp = new int[nums.length+1][5];
while (i < j) {
dp[i+1][0] = Math.max( nums[i], dp[i][0] + nums[i]);
dp[i+1][1] = Math.min (nums[i], dp[i][1] + nums[i]);
i++;
// System.out.println( dp[j][0]+","+dp[j][3]+","+dp[j][2]+","+dp[j][1]);
}
while (j > 0) {
dp[j-1][2] = Math.max( nums[j], dp[j][2] + nums[j]);
dp[j-1][3] = Math.min( nums[j], dp[j][3] + nums[j]);
j--;
}
dp[j][4] = Math.max(dp[j+1][0] - dp[ j][3], dp[j][2] - dp[j+1][1]);
System.out.println( dp[j+1][0]+","+dp[j][3]+","+dp[j][2]+","+dp[j+1][1]);
j++;
while (j < i) {
dp[j][4] = Math.max(dp[j - 1][4],
Math.max(dp[j+1][0] - dp[ j][3], dp[j][2] - dp[j+1][1])
);
// System.out.println(dp[j - 1][4] + "," + dp[j][4]);
System.out.println( dp[j][0]+","+dp[i-j][3]+","+dp[i-j][2]+","+dp[j][1]);
j++;
}
return dp[j - 1][4];
}
}