leetcode解题报告: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.

难度:Medium

解法一: 最简单的办法,复杂度O(n^2),用一个变量max记录历史最大子序列和。分别以每个元素作为子序列的首元素开始往子序列里添加连续的元素,直到该子序列的和小于0为止,同时每当更新子序列的和时,要比较它与max的大小关系,如果它比max还大要更新max的值。 如果该子序列的和已经小于0了,则说明就算再往里面添数,该子序列也不可能是最大连续和的。 那么下一个子序列就要从上次子序列结束的地方开始。 

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        if(nums.size()==0)
        return 0;
        
        int max=nums[0];
        for(int i = 0;i<nums.size();i++)
        {
            if(nums[i]>max)
            max=nums[i];
            if(nums[i]<0) continue;
            int sum=nums[i];
            for(int j=i+1;j<nums.size();j++)
            {
                sum+=nums[j];
                if(sum>max)
                max=sum;
                if(sum<0)
                {
                    break;
                }
            }
                if(sum>max)
                max=sum;
        }
        return max;
        
    }
};
这种方法虽然很容易,但是时间复杂度太高。
思路二: O(n)时间复杂度解法: 

用一个max变量来记录最大值,cur变量用来标记当前连续子串的和,如果cur不为负,那么cur加上当前元素的值,如果cur的值为负,则将cur赋值为当前元素的值,注意每次循环都要比较cur与max,如果cur大于max,max要被更新。

        所有元素被遍历一次后,返回max即可。

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值