您的位置:首页 > 其它

LintCode:最大子数组 II

2015-11-24 23:11 411 查看
给定一个整数数组,找出两个不重叠子数组使得它们的和最大。
每个子数组的数字在数组中的位置应该是连续的。
返回最大的和。
您在真实的面试中是否遇到过这个题?

Yes

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

注意

子数组最少包含一个数

挑战

要求时间复杂度为O(n) Expand

相关题目 Expand

解题思路:
先左边遍历数组,记录该数组的每个元素的左的最大值,
再右边遍历数组,记录该数组的每个元素的右最大值。
所求结果既是左边最大值+右边最大值的最大值

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 == null || nums.size() < 2)
return 0;
int len = nums.size();
int[] lsum = new int[len];
int[] rsum = new int[len];
int sum = 0;
int minsum = 0;
int max = Integer.MIN_VALUE;
for(int i=0;i<nums.size();i++){
sum += nums.get(i);
max = Math.max(max, sum-minsum);
minsum = Math.min(sum, minsum);
lsum[i] = max;
}

sum = 0;
minsum = 0;
max = Integer.MIN_VALUE;
for(int i=nums.size()-1;i>0;i--){
sum += nums.get(i);
max = Math.max(max, sum-minsum);
minsum = Math.min(sum, minsum);
rsum[i] = max;
}
max = Integer.MIN_VALUE;
for(int i=0;i<len-1;i++){
max = Math.max(max, lsum[i]+rsum[i+1]);
}
return max;

}
}



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