Lintcode 42. Maximum Subarray II

42. Maximum Subarray II

Given an array of integers, find two non-overlapping subarrays which have the largest sum.
The number in each subarray should be contiguous.
Return the largest sum.

Example

For given [1, 3, -1, 2, -1, 2], the two subarrays are [1, 3] and [2, -1, 2] or [1, 3, -1, 2] and [2], they both have the largest sum 7.

Challenge

Can you do it in time complexity O(n) ?

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
     int left[nums.size()];int right[nums.size()];
     int leftMax = nums.at(0); int leftSum = nums.at(0);
     left[0]= nums.at(0);
     for(int i = 1;i<nums.size();i++){
      if(leftSum<0)
         leftSum = 0;
      leftSum += nums.at(i);
      if(leftMax<leftSum)
         leftMax = leftSum;
      left[i] = leftMax;
     }
     
     int rightMax = nums.at(nums.size()-1); int rightSum = nums.at(nums.size()-1);
     right[nums.size()-1]=nums.at(nums.size()-1);
     for(int i = nums.size()-2;i>=0;i--){
      if(rightSum<0)
        rightSum = 0;
      rightSum += nums.at(i);
      if(rightMax<rightSum)
         rightMax = rightSum;
      right[i]=rightMax;
     }
   
     int Max = left[0]+right[1];
     for(int j = 1;j<nums.size()-1;j++){
         if(Max < left[j]+right[j+1])
            Max = left[j]+right[j+1];
     }
     return Max;
    }
};


刚开始用vector存储left和right两个数组,发现不能在特定位置插入数据,故舍弃;

用空间换时间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值