-
题目:
求数组nums的连续子列的最大和; -
思路:下面两种方法实际做的事情相同,只是理解方式不同
1.扫描一次: O(n) O(1)
若当前子列和为负代表托整体后腿,因此这一段直接丢,重新开始找;
不断更新当前最大值curmax和整体最大值resmax;
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int resmax = INT_MIN, curmax = 0;//resmax表示整个数组的最大连续子数组和,curmax表示当前最大连续子数组和
for (int i = 0; i < nums.size(); ++i) {
curmax += nums[i];
resmax = max(resmax, curmax);//更新结果
curmax = max(curmax, 0);//如果目前<0,说明拖后腿,就丢了
}
return resmax;
}
};
2.dp:O(n) ,O(1)
一个数的动态规划,s表示以前一个数结尾的所有连续子数组的最大和,则以当前数结尾的有两种情况:若s<=0,就只要当前数,若s>0,就加上当前数;
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int res = INT_MIN, s = 0;//res是结果,s是以前一个数结尾的所有子数组中的最大和
for (int i = 0; i < nums.size(); ++i) {
s = max(s + nums[i], nums[i]);//以当前i结尾的所有子数组的最大和:若s > 0,则s+nums[i]最大,若s<=0,则丢掉前面的最大;
res = max(res, s);
}
return res;
}
};