题目描述
一个数组有 N 个元素,求连续子数组的正数最大的和。
输入描述: 输入为两行。 第一行一个整数n(1 <= n <= 100000),表示一共有n个元素 第二行为n个数,即每个元素,每个 整数都在32位int范围内。以空格分隔。
输出描述: 所有连续子数组中正数和最大的值。
示例
输入:20 3 -12 50 7
输出: 57
解题思路
碰到负数则之前的和清零,重新计算正数的和。
完整代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdlib.h>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n = 0;
cin >> n;
vector <int> v;
for (int i = 0; i < n; i++)
{
int a = 0;
cin >> a;
v.push_back(a);
}
int sum = v[0];
int s2 = 0;
int s1 = 0;
for (int i = 1; i < n; i++)
{
if (v[i] < 0)
{
s2 = s1 = v[i];
}
else
s2 = s1 + v[i];
if (s2>s1)
s1 = s2;
else
{
sum = s1;
s1 = 0;
}
sum = sum > s2 ? sum : s2;
}
cout << sum;
system("pause");
return 0;
}
这道题和之前的 连续最大和很容易混淆,所以我在这里有必要说明一下。
连续最大和 https://blog.csdn.net/ly_6699/article/details/90607625 :
只要求和是最大的即可,其中如果满足要求,负数也有可能算在最大和的里面。
例如(20 3 -12 50 7) 在这里会输出 68。
连续最大正数和:只计算正数求和的大小,遇到负数则归0重新计算。
例如(20 3 -12 50 7) 在这里会输出 57。
因为我自己理解的时候也栽在这里,想了好久才明白。所以想提醒一下大家!!
这里有其他问题的小伙伴欢迎留言,大家可以一起讨论。
并且 要记得关注博主哟~