[LintCode]41.最大子数组

给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。

样例

给出数组[−2,2,−3,4,−1,2,1,−5,3],符合要求的子数组为[4,−1,2,1],其最大和为6

思路: 将子串和为负数的子串丢掉,只留和为正的子串。
如果nums中有正数,从左到右遍历nums,用变量cur记录每一步的累加和,遍历到正数cur增加,遍历到负数cur减少。

当cur>=0时,每一次累加都可能是最大的累加和,所以,用另外一个变量max全程跟踪记录cur出现的最大值即可。

class Solution {
public:
    /*
     * @param nums: A list of integers
     * @return: A integer indicate the sum of max subarray
     */
    int maxSubArray(vector<int> nums) {
        if(nums.size()<=0){
            return 0;
        } 
        int max=INT_MIN,cur=0;//c++最小值
        for(int i=0; i<nums.size(); i++)  
        {  
            if(cur < 0)
                cur = nums[i];//如果前面加起来的和小于0,抛弃前面的
            else
                cur+=nums[i];

            if(cur > max)
                max = cur;
        }  
        return max;  
        
    }
};

tips:当题目涉及到求最大最小值时,最初的比较数字就应当设置为INT_MAX或INT_MIN,更为安全。<limits.h>中有INT_MAX和INT_MIN的宏定义可直接使用。
或者自行定义宏
#define INT_MAX 0x7fffffff
#define INT_MIN 0x80000000
INT_MAX = 2147483647
INT_MIN = -2147483648
这仅试用在没有限制范围的情况下使用。否则同样会出现其他连锁的错误。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值