求最大连续子序列和
需要考虑:
1 sum_max等于某个元素的值(例如某一元素是正数, 其余元素都是负数; 或者所有元素都为负数)
2 sum_max等于某一段连续元素的和
对第一种情况 用
if(sum_max < i)
{
sum_max = i;
}
就可以了
对第二种情况, 解决方法是, 从0开始遍历数组ar, 如果遍历到i时, sum < 0, 那么, 就将[0, i]中的元素舍弃, 将sum置0, 重新开始从ar[i+1]累加, 这样做的原因, 可以简单解释如下:
1 如果ar[0] < 0, 则舍弃ar[0]
2 如果不是上一种情况, 而且s = ar[0] + ar[1], s < 0, 那么说明ar[0] >= 0, ar[1] < 0, 并且ar[1] 的绝对值大于ar[0]的绝对值, 此时ar[2]及其后面的元素, 不能和ar[1]连续起来
3 如果不是上一种情况, 而且s = ar[0] + ar[1] + ar[2], s < 0, 那么说明ar[0] + ar[1] >= 0, ar[2] < 0, 并且ar[2] 的绝对值大于(ar[0] + ar[1])的绝对值, 此时ar[3]及其后面的元素, 不能和ar[2]连续起来
代码如下:
#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector <int> v = {-2, 11, -20, -4, 13, -5, 14, 1, -5};
int sum = 0;
int sum_max = v[0];
for(auto i : v)
{
if(sum_max < i)
{
sum_max = i;
}
sum += i;
if(sum_max < sum)
{
sum_max = sum;
}
if(sum < 0)
{
sum = 0;
}
}
printf("sum_max: %d \n", sum_max);
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。