LeetCode Day42 Maximum Subarray

法一:O(n)

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int res=INT_MIN,cursum=0;
        for(auto num:nums){
            cursum=max(cursum+num,num);//cursum<0,cursum=num;
            res=max(cursum,res);
        }
        return res;
    }
};

法二:分治法O(nlogn)

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        if(nums.empty()) return 0;
        return helper(nums,0,nums.size()-1);
    }
    int helper(vector<int>& nums,int left,int right){
        if(right<=left) return nums[left];
        else{
            int mid=left+(right-left)/2;
            int lmax=helper(nums,left,mid-1);
            int rmax=helper(nums,mid+1,right);
            int mmax=nums[mid],t=mmax;
            for(int i=mid-1;i>=left;i--){
                t+=nums[i];
                mmax=max(t,mmax);
            }
            t=mmax;
            for(int i=mid+1;i<=right;i++){
                t+=nums[i];
                mmax=max(t,mmax);
            }
            return max(mmax,max(lmax,rmax));
        }
        
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_41394379/article/details/84498800