题目链接:53. Maximum Subarray
C++
//Approach 1
//情况一、对于只有负数的数组而言,结果为所有负数中最大的数
//情况二、对于有正数情况下,从做往右边扫,维护一个和为正的区间,如果为负数则放弃该区间(详细见代码)
class Solution{
public:
int maxSubArray(vector<int>& nums){
int ans=nums[0];
int st=0,cur=0;
int sum=0;
//sum=nums[0];
int flag=0;
int maxt=nums[0];
for(int i=0;i<nums.size();i++){
if(nums[i]<=0)flag++;
maxt=max(maxt,nums[i]);
sum+=nums[i];
if(sum>=0){
ans=max(ans,sum);
cur=i;
}
else{
st=i+1;
cur=i+1;
sum=0;
}
}
// cout<<"---"<<flag<<endl;
if(flag==nums.size())return maxt;
else return ans;
}
};
//Approach 2
//动态规划
//假设 nums[i] 表示数组的第i个值, sum[i] 表示前i个值对应的符合题意的最大值, 则 sum[i] = max(nums[i],nums[i]+sum[i-1])
class Solution{
public:
int maxSubArray(vector<int>& nums){
vector<int>sum;
sum.push_back(nums[0]);
int ans=nums[0];
for(int i=1;i<nums.size();i++){
sum.push_back(max(nums[i],sum[i-1]+nums[i]));
ans=max(ans,sum[i]);
}
return ans;
}
};
Python 实现
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
ans = nums[0]
ans2=nums[0]
st = cur = sum = flag = 0
for i in range(0,len(nums)):
if nums[i] <=0:
flag+=1
ans2 = max(ans2, nums[i])
sum+=nums[i]
if sum>=0:
cur = i
ans = max(sum,ans)
else:
sum =0
st = i + 1
cur = i + 1
if flag == len(nums):
return ans2
return ans