Lintcode 最大子数组差

给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大。

返回这个最大的差值。

 注意事项

子数组最少包含一个数

样例

给出数组[1, 2, -3, 1],返回 6

挑战 

时间复杂度为O(n),空间复杂度为O(n)

标签 

贪心 枚举法 LintCode 版权所有 数组 子数组 前后遍历


class Solution {
public:
    /**
     * @param nums: A list of integers
     * @return: An integer indicate the value of maximum difference between two
     *          Subarrays
     */
    int maxDiffSubArrays(vector<int> nums) {
        // write your code here
        if(nums.empty())
        return 0;
        
        int max,min,suma,sumi;
        int n=nums.size();
        int lefta[n],righti[n];
        int lefti[n],righta[n];
        
        lefti[0]=lefta[0]=max=min=suma=sumi=nums[0];
        
        for(int i=1;i<n;i++){
            if(suma<=0)
            suma=nums[i];
            else
            suma+=nums[i];
            
            if(max<suma)
            max=suma;
            
            lefta[i]=max;
            
            
            
            if(sumi>=0)
            sumi=nums[i];
            else
            sumi+=nums[i];
            
            if(min>sumi)
            min=sumi;
            
            lefti[i]=min;
  //          cout<<max<<" "
        }
  //      cout<<endl;
        righta[n-1]=righti[n-1]=min=max=sumi=suma=nums[n-1];
        
        for(int i=n-2;i>=0;i--){
            if(suma<=0)
            suma=nums[i];
            else
            suma+=nums[i];
            
            if(max<suma)
            max=suma;
            
            righta[i]=max;
            
            
            
           if(sumi>=0)
            sumi=nums[i];
            else
            sumi+=nums[i];
            
            if(min>sumi)
            min=sumi;
            
            righti[i]=min;
   //          cout<<min<<" "
        }
   //       cout<<endl;
        max=abs(lefta[0]-righti[1]);
        for(int i=1;i<n-1;i++){
            if(abs(lefta[i]-righti[i+1])>max)
            max=abs(lefta[i]-righti[i+1]);
            
            if(abs(lefti[i]-righta[i+1])>max)
            max=abs(lefti[i]-righta[i+1]);
        }
        return max;
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值