题目:

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

样例:

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

思路:

动态规划的思想,先从左到右去寻找到i的最大子数组和,将结果存在一个新的数组中;然后再从右到左去寻找最大子数组和;考虑两者之和,取最大值。

参考答案:

class Solution {
public:
    /*
     * @param nums: A list of integers
     * @return: An integer denotes the sum of max two non-overlapping subarrays
     */
    int maxTwoSubArrays(vector<int> &nums) {
        // write your code here
        if (nums.size() == 0 | nums.size()==1)
            cout<<"the input is zero!"<<endl;
        //if(nums.size()==2)
       // {
          //  return nums[0]+nums[1];
       // }

        int news[nums.size()];
        int sum=nums[0];
        int sum_max=nums[0];
        news[0] = nums[0];        

        for(int i=1;i<nums.size()-1;i++){
            sum=max(nums[i],nums[i]+sum);
            if(sum > sum_max){
                sum_max = sum;
            }
            news[i] = sum_max;  //新数组表示以i结尾的最大值;
        }
         
        sum = 0;
        sum_max = nums[nums.size()-1];
        int result = -123;

        for(int i=nums.size()-1; i>0; i--){
            
            sum = max(nums[i], nums[i]+sum);
            if(sum >= sum_max){
                sum_max = sum;
            }
               result = max(result, sum_max+news[i-1]);
        }
        return result;
    }
};

wydong
40 声望5 粉丝

wyd


« 上一篇
最大子数组
下一篇 »
Android Intent