这道题是I的拓展,有点像stock的2但是还是挺不一样的,这里是求和不是求差,所以只需要对每个点i通过I的方法分别求出左右的最大子序列然后历遍相加即可,要注意的是left[i]储存的是0-i的最大sum,而right[i]则是i+1 ~ n-1的sum,这一点需要注意。
public class Solution {
/**
* @param nums: A list of integers
* @return: An integer denotes the sum of max two non-overlapping subarrays
*/
public int maxTwoSubArrays(ArrayList<Integer> nums) {
// write your code
if (nums.size() == 0) {
return 0;
}
int n = nums.size();
int[] left=new int[n];
int[] right=new int[n];
left[0]=nums.get(0);
int local = nums.get(0);
for (int i = 1; i < nums.size(); i++) {
local = Math.max(nums.get(i), local + nums.get(i));
left[i] = Math.max(local, left[i-1]);
}
right[n-2]=nums.get(n-1);
local = nums.get(n-1);
for (int i = n-3; i >= 0; i--) {
local = Math.max(nums.get(i + 1), local + nums.get(i + 1));
right[i] = Math.max(local, right[i+1]);
}
int value = Integer.MIN_VALUE;
for (int i = 0; i < n-1; i++) {
value = value > left[i] + right[i] ? value : left[i] + right[i];
}
return value;
}
}
第二题也不难和上面不同的是绝对值最大要求两边一个最大一个最小。
public class Solution {
/**
* @param nums: A list of integers
* @return: An integer indicate the value of maximum difference between two
* Subarrays
*/
public int maxDiffSubArrays(ArrayList<Integer> nums) {
// write your code
if (nums.size() == 0) {
return 0;
}
int n = nums.size();
int[] left=new int[n];
int[] right=new int[n];
int[] leftMI=new int[n];
int[] rightMI=new int[n];
left[0]=nums.get(0);
leftMI[0]=nums.get(0);
int local = nums.get(0);
int localMI = nums.get(0);
for (int i = 1; i < nums.size(); i++) {
local = Math.max(nums.get(i), local + nums.get(i));
left[i] = Math.max(local, left[i-1]);
localMI = Math.min(nums.get(i), localMI + nums.get(i));
leftMI[i] = Math.min(localMI, leftMI[i-1]);
}
right[n-2]=nums.get(n-1);
rightMI[n-2]=nums.get(n-1);
local = nums.get(n-1);
localMI = nums.get(n-1);
for (int i = n-3; i >= 0; i--) {
local = Math.max(nums.get(i + 1), local + nums.get(i + 1));
right[i] = Math.max(local, right[i+1]);
localMI = Math.min(nums.get(i + 1), localMI + nums.get(i + 1));
rightMI[i] = Math.min(localMI, rightMI[i+1]);
}
int value1 = Integer.MIN_VALUE;
int value2 = Integer.MIN_VALUE;
int value = Integer.MIN_VALUE;
for (int i = 0; i < n-1; i++) {
value1 = value1 > Math.abs(left[i] - rightMI[i]) ? value1 : Math.abs(left[i] - rightMI[i]);
value2 = value2 > Math.abs(leftMI[i] - right[i]) ? value2 : Math.abs(leftMI[i] - right[i]);
value = Math.max(value, Math.max(value1, value2));
}
return value;
}
}