子数组的最大累加和问题
题目描述
给定一个数组arr,返回子数组的最大累加和
例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12.
[要求]
时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( 1 ) O(1) O(1)
输入描述:
第一行一个整数N。表示数组长度
接下来一行N个整数表示数组内的元素
输出描述:
输出一个整数表示答案
示例1
输入
7
1 -2 3 5 -2 6 -1
输出
12
备注:
1
⩽
N
⩽
1
0
5
1 \leqslant N \leqslant 10^5
1⩽N⩽105
−
100
⩽
a
r
r
i
⩽
100
-100 \leqslant arr_i \leqslant 100
−100⩽arri⩽100
题解:
此题值得好好研究,可以感受一步步将算法从最基础的 O ( n 3 ) O(n^3) O(n3) 优化到 O ( n ) O(n) O(n) 的快感。
具体参考:连续子数组最大和
代码:
#include <cstdio>
#include <algorithm>
using namespace std;
int main(void) {
int n, val;
int cur = 0;
int ret = 0;
scanf("%d", &n);
while ( n-- ) {
scanf("%d", &val);
cur += val;
if ( cur < 0 ) cur = 0;
else ret = max( ret, cur );
}
return 0 * printf("%d\n", ret);
}