思路:
方法一:复杂度为o(n),依次遍历数组中的每个数。
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int ans=INT_MIN,t=0;
for(auto a:nums)
{
t=max(a,t+a);
ans=max(t,ans);
}
return ans;
}
};
方法为二:进阶,分治法
类似二分法,将数组一分为二,分别找出左边和右边的最大子数组之和,然后还要从中间开始向左右分别扫描,求出的最大值分别和左右两边得出的最大值相比较取最大的那一个。
class Solution {
public:
int maxSubArrayDFS(vector<int>&nums,int left,int right)
{
if(left>=right) return nums[left];
int mid=(left+right)/2;
int leftmax=maxSubArrayDFS(nums,left,mid-1);
int rightmax=maxSubArrayDFS(nums,mid+1,right);
int midmax=nums[mid],t=midmax;
for(int i=mid-1;i>=left;--i)
{
t=t+nums[i];
midmax=max(midmax,t);
}
t=midmax;
for(int i=mid+1;i<=right;++i)
{
t+=nums[i];
midmax=max(midmax,t);
}
return max(leftmax,max(rightmax,midmax));
}
int maxSubArray(vector<int>& nums) {
int ans;
if(nums.size()==0) return 0;
int l=0,r=nums.size()-1;
ans=maxSubArrayDFS(nums,l,r);
return ans;
}
};