You are given an array of integers (both positive and negative). Find the contiguous sequence with the largest sum. Return the sum.
Example:
Input: [-2,1,-3,4,-1,2,1,-5,4]
Output: 6
Explanation: [4,-1,2,1] has the largest sum 6.
Follow Up:
If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/contiguous-sequence-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
//dynamic programming
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int curMax=INT_MIN;
int len=nums.size();
if(len==1) curMax=nums[0];
vector<int> M(len); //初始化为0
M[0]=nums[0];
for(int i=1;i<len;i++){
/*if(M[i-1]>curMax) curMax=M[i-1];
if(M[i-1]>=0) M[i]=M[i-1]+nums[i];
else M[i]=nums[i];*/
curMax=max(M[i-1],curMax);
M[i]=max(M[i-1]+nums[i],nums[i]);
}
//if(M[len-1]>curMax) curMax=M[len-1];
curMax=max(M[len-1],curMax);
return curMax;
}
};
//divide and conquer
class Solution {
public:
int findCrossing(vector<int>& nums, int low, int mid, int high){
int leftSum=INT_MIN;
int sum=0;
for(int i=mid;i>=low;i--){
sum=sum+nums[i];
leftSum=max(sum,leftSum);
}
int rightSum=INT_MIN;
sum=0;
for(int i=mid+1;i<=high;i++){
sum=sum+nums[i];
rightSum=max(sum,rightSum);
}
return leftSum+rightSum;
}
int findMaxSubArray(vector<int>& nums, int low, int high){
int mid=0;
if(high==low){
return nums[low];
}
else mid=(low+high)/2;
int left=findMaxSubArray(nums,low,mid);
int right=findMaxSubArray(nums,mid+1,high);
int cross=findCrossing(nums,low,mid,high);
int ret=max(left,right);
return max(ret,cross);
}
int maxSubArray(vector<int>& nums) {
int curMax=INT_MIN;
int len=nums.size();
curMax=findMaxSubArray(nums,0,len-1);
return curMax;
}
};
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int curMax=nums[0];
int cur=nums[0];
int len=nums.size();
if(len==1) return cur;
for(int i=1;i<len;i++){
if(cur<0) cur=nums[i];
else cur+=nums[i];
curMax=max(curMax, cur);
}
return curMax;
}
};