法一: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));
}
}
};