贪心算法:
当前指针所指元素之前元素的和小于0,丢弃指针之前所有元素。若大于0就加上。
-2 1 -3 4 -1 2 1 -5 4
当前值 | 之前和 | 当前和 | 最大和 |
-2 | INT_MIN | -2 | -2 |
1 | -2 (<0) | 1 | 1 |
-3 | 1 (>0) | -2 (1+(-3)) | 1 |
4 | -2 (<0) | 4 | 4 |
-1 | 4 | 3 | 4 |
2 | 3 | 5 | 5 |
1 | 5 | 6 | 6 |
-5 | 6 | 1 | 6 |
4 | 1 | 5 | 6 |
class Solution
{
public:
int maxSubArray(vector<int> &nums)
{
//类似寻找最大最小值的题目,初始值一定要定义成理论上的最小最大值
int result = INT_MIN;//INT_MIN -- 最小整数
int numsSize = int(nums.size());
int sum = 0;
for (int i = 0; i < numsSize; i++)
{
sum += nums[i];
result = max(result, sum);
//如果sum < 0,重新开始找子序串
if (sum < 0)
{
sum = 0;
}
}
return result;
}
};
- 关于INT_MIN
INT_MIN在标准头文件limits.h中定义
#define INT_MAX 2147483647
#define INT_MIN (-INT_MAX - 1)
C中int类型是32位的,范围是-2147483648到2147483647 (即2的31次幂)
(1)最轻微的上溢是INT_MAX + 1 :结果是 INT_MIN;
(2)最严重的上溢是INT_MAX + INT_MAX :结果是-2;
(3)最轻微的下溢是INT_MIN - 1:结果是是INT_MAX;
(4)最严重的下溢是INT_MIN + INT_MIN:结果是0 。