Lincode42.最大子数组 II-----前缀和
题目表述
描述
给定一个整数数组,找出两个 不重叠 子数组使得它们的和最大。
每个子数组的数字在数组中的位置应该是连续的。
返回最大的和。
示例1:
输入:nums = [1, 3, -1, 2, -1, 2]
输出:7
解释:最大的子数组为 [1, 3] 和 [2, -1, 2] 或者 [1, 3, -1, 2] 和 [2].
双数组
public class Solution {
/**
* @param nums: A list of integers
* @return: An integer denotes the sum of max two non-overlapping subarrays
*/
public int maxTwoSubArrays(List<Integer> nums) {
// write your code here
int[] leftSeqMax = new int[nums.size()];
int[] rightSeqMax = new int[nums.size()];
int max_mum = Integer.MIN_VALUE;
int cur = 0;
for(int i = 0; i < nums.size(); i++){
if(cur <= 0){
cur = nums.get(i);
}else{
cur += nums.get(i);
}
leftSeqMax[i] = max_mum = Math.max(max_mum, cur);
}
max_mum = Integer.MIN_VALUE;
cur = 0;
for(int i = nums.size() - 1; i >= 0; i--){
if(cur <= 0){
cur = nums.get(i);
}else{
cur += nums.get(i);
}
rightSeqMax[i] = max_mum = Math.max(max_mum, cur);
}
int res = Integer.MIN_VALUE;
for(int i =0; i < nums.size() - 1;i++){
res = Math.max(res, leftSeqMax[i] + rightSeqMax[i + 1]);
}
return res;
}
}