LintCode-最大子数组 II

题目:

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


分析:

1.求一个最小的分割数组,然后在左右边界两边再分别求两个最大连续子数组,但是对于左右边界达到了原数组的情况,需要从其内部找最大连续子数组,此路不通。

2.直接求左右两侧的最大连续子数组,由于一侧取得最大的时候对于求另一侧子数组会有影响,导致和不一定为最大,所以局部最优没用,只能枚举。一种方法遍历数组,每求一个当前最大连续子数组,嵌套求出剩余部分的最大连续子数组,O(n^2)。

3.先从左遍历数组,保存遍历到每个元素的当前的最大连续子数组的值;从右遍历数组,记录同样的最大连续子数组的值;遍历数组比较每种组合的左右最大连续子数组的和值,返回最大的值。


代码:

	int result = nums[0],sum = 0;
        vector left(nums.size(),0),right(nums.size(),0);
        for (int i = 0;i < nums.size();i++) {
            sum += nums[i];
            result = max(result,sum);
            sum = max(sum,0);
            left[i] = result;
        }
        sum = 0,result = nums[nums.size()-1];
        for (int i = nums.size()-1;i > 0;i--) {
            sum += nums[i];
            result = max(result,sum);
            sum = max(sum,0);
            right[i] = result;
        }
        result = INT_MIN;
        for (int i = 0;i < nums.size()-1;i++) {
            result = max(result,left[i] + right[i+1]);
        }
        return result;


 
   

你可能感兴趣的:(LintCode-最大子数组 II)