一、解题思路
Max[i]表示:以nums[i]为开头的所有连续子数组和的最大值。
由此可以推出Max[i-1]和Max[i]的关系:
若Max[i]>=0:Max[i-1]=nums[i-1]+Max[i];
否则:Max[i-1]=nums[i-1];
则ans=MAX(Max[0]、Max[1]、......、Max[n-1])
代码示例:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int max,sum,n;
n=nums.size();
sum=nums[n-1];
max=nums[n-1];
for(int i=n-2;i>=0;i--){
if(max>=0){
max+=nums[i];
}else{
max=nums[i];
}
if(sum<max){
sum=max;
}
}
return sum;
}
};
二、拓展
同样的思路,可以计算Min[i]:以nums[i]为开头的所有连续子数组和的最小值。
这道题可以和力扣以下的题目相互照应做,其核心思路相同:
1749. 任意子数组和的绝对值的最大值 - 力扣(LeetCode)https://leetcode.cn/problems/maximum-absolute-sum-of-any-subarray/1749题:该题要求计算连续子数组和的绝对值的最大值ans,其中ans可以是最大值的绝对值,也可以是最小值的绝对值。因此ans=MAX(abs(Max[0])、......、abs(Max[n-1]),abs(Min[0])、......、abs(Min[n-1]))。
1749题另一个解题思路:
任意子数组和的绝对值的最大值【力扣1749】_叫小侯的小白程序员的博客-CSDN博客https://blog.csdn.net/qq_44228301/article/details/132190945这个思路中Min[i]、Max[i]的意义和本题是不同的。