[53]Maximum Subarray

【题目描述】

Find the contiguous subarray within an array (containing at least one number) which has the largest sum.

For example, given the array [−2,1,−3,4,−1,2,1,−5,4],
the contiguous subarray [4,−1,2,1] has the largest sum = 6.

【思路】

1.dp。记录当前元素之和即当前元素和的最大值,与所得的最大值进行比较,如果大于则进行更新,否则继续。如果在遍历的过程中,当前元素和小于0,则将其值归于0。遍历结束后,如果最大值等于0,则输出元素中的最大值。

2.divide and conquer。还有问题,解决了再贴上来。

3.kadane算法:规则是如果前面一段连续子数组的和小于0,那么就丢弃它。其实也蛮好理解的,举个简单例子,比如:数组-1, 2, 3,-1为负数,为了使得子数组之和最大,显然不应当把-1计入进内。

【代码】

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int nz=nums.size();
        int maxsum=0;
        int cursum=0;
        for(int i=0;i<nz;i++){
            cursum+=nums[i];
            if(cursum<0) cursum=0;
            if(cursum>maxsum) maxsum=cursum;
        }
        if(maxsum==0){
            maxsum=nums[0];
            for(int i=1;i<nz;i++){
                if(nums[i]>maxsum) maxsum=nums[i];
            }
        }
        return maxsum;
    }
};


3.

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int maxsofar,maxendhere;
        maxsofar=maxendhere=nums[0];
        for(int i=1;i<nums.size();i++){
            maxendhere+=nums[i];
            if(maxendhere<nums[i]) maxendhere=nums[i];
            if(maxendhere>maxsofar) maxsofar=maxendhere;
        }
        return maxsofar;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值