输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
示例1:
输入: nums = [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
提示:
1 <= arr.length <= 10^5
-100 <= arr[i] <= 100
思路,最大子序列可能在右边或左边,如果在中间则横跨左右,且保持中间连续,所以下面2个循环采用从中间到两边寻找;
利用二分递归我们可以实现这一点;返回中间最大子序列或左右
class Solution {
public:
int Maxnum(vector<int>& nums,int l,int n)
{
if(l==n)
{
return nums[l];
}
int mid=(l+n)/2;
int Maxleft=Maxnum(nums,l,mid);
int Maxright=Maxnum(nums,mid+1,n);
int Maxl=-100,numl=0;
for(int i=mid;i>=l;i--)
{
numl+=nums[i];
if(numl>Maxl)
Maxl=numl;
}
int Maxr=-100,numr=0;
for(int i=mid+1;i<=n;i++)
{
numr+=nums[i];
if(numr>Maxr)
Maxr=numr;
}
int z=max(Maxleft,Maxright);
return max(z,Maxr+Maxl);
}
int maxSubArray(vector<int>& nums) {
return Maxnum(nums,0,nums.size()-1);
}
};