最大子序列和
示例一:
-2 | 1 | -3 | 4 | -1 | 2 | 1 | -5 | 4 |
---|
定义四个变量 当前值curData, 之前和 lastSum, 现在和curSum,最大和maxSum.
思路 贪心算法。 若之前和小于零,当前和等于当前值,反之当前和等于之前和加上当前值,每轮最后让当前值与最大值进行比较更新。
初始化:
变量 | 数据 |
---|---|
当前值 | -2 |
之前和 | 0 |
当前和 | -2 |
最大和 | -2 |
第一轮:
变量 | 数据 |
---|---|
当前值 | 1 |
之前和 | -2 |
当前和 | 1 |
最大和 | 1 |
第二轮:
变量 | 数据 |
---|---|
当前值 | -3 |
之前和 | -2 |
当前和 | -3 |
最大和 | 1 |
第三轮:
变量 | 数据 |
---|---|
当前值 | 4 |
之前和 | -3 |
当前和 | 4 |
最大和 | 4 |
第四轮:
变量 | 数据 |
---|---|
当前值 | -1 |
之前和 | 4 |
当前和 | 3 |
最大和 | 4 |
第五轮:
变量 | 数据 |
---|---|
当前值 | 2 |
之前和 | 3 |
当前和 | 5 |
最大和 | 5 |
第六轮:
变量 | 数据 |
---|---|
当前值 | 1 |
之前和 | 5 |
当前和 | 6 |
最大和 | 6 |
第七轮:
变量 | 数据 |
---|---|
当前值 | -5 |
之前和 | 6 |
当前和 | 1 |
最大和 | 6 |
第八轮:
变量 | 数据 |
---|---|
当前值 | 4 |
之前和 | 1 |
当前和 | 5 |
最大和 | 6 |
至此 遍历完毕,最大和为6,其他示例感兴趣的小伙伴也可以去试试
下面奉上代码
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int curData = nums[0], lastSum = 0, curSum = nums[0], maxSum = nums[0];
for (int i = 1; i < nums.size(); i++) {
lastSum = curSum;
curData = nums[i];
if (lastSum < 0) {
curSum = curData;
}
else {
curSum += curData;
}
if (curSum > maxSum) maxSum = curSum;
}
return maxSum;
}
};