您的位置:首页 > 其它

lintcode最大子数组||

2018-03-11 13:41 295 查看

问题描述:

给定一个整数数组,找出两个不重叠子数组使得它们的和最大。
每个子数组的数字在数组中的位置应该是连续的。
返回最大的和。

样例:

给出数组 
[1, 3, -1, 2, -1, 2]

这两个子数组分别为 
[1, 3]
 和 
[2, -1, 2]
 或者 
[1, 3, -1, 2]
 和 
[2]
,它们的最大和都是 
7


思路:

从左到右依次给出前n个数相加的最大值,然后从右到左依次给出后n个数相加的最大值。
以[1, 3, -1, 2, -1, 2]为例:
从左到右:1 4 4 5 5 6
从右到左:6 5 3 3 2 2
然后将其错位相加:6 6 7 7 7 7 6
显然最大值是7

答案:

public int maxTwoSubArrays(ArrayList<Integer> nums) {
// write your code
int[] leftMax = new int[nums.size()], rightMax = new int[nums.size()];
int sum = nums.get(0);

leftMax[0] = nums.get(0);
int maxVal = nums.get(0);

for(int i = 1; i < nums.size(); i++){
sum = Math.max(nums.get(i), sum + nums.get(i));
maxVal = Math.max(maxVal, sum);
leftMax[i] = maxVal;
}

sum = nums.get(nums.size() - 1);
rightMax[nums.size() - 1] = sum;
maxVal = sum;

for(int i = nums.size() - 2; i >= 0; i--){
sum = Math.max(nums.get(i), sum + nums.get(i));
maxVal = Math.max(maxVal, sum);
rightMax[i] = maxVal;
}

int ans = Integer.MIN_VALUE;

for(int i = nums.size() - 1; i > 0; i--) ans = Math.max(ans, rightMax[i] + leftMax[i - 1]);

return ans;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: