前缀和问题
1.子数组的最大累加和问题
题目描述
给定一个数组arr,返回子数组的最大累加和
例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12.
[要求]
时间复杂度为O(n)O(n),空间复杂度为O(1)O(1)
输入描述:
第一行一个整数N。表示数组长度
接下来一行N个整数表示数组内的元素
输出描述:
输出一个整数表示答案
示例1
输入
7 1 -2 3 5 -2 6 -1
输出
12
1)创建两个变量maxsum 和 thissum来分别记录数组中最大和以及遍历到目前位置的和
2)首先将maxsum初始化为数组首元素,thissum初始化为0
3)将数组元素与thissum相加,并于maxsum比较,看是否需要更新maxsum
4)判断thissum是否大于0,如果thissum小于0,那么前面一段数的加入,对于求最大和而言是有副作用的,所以令thissum = 0,将前面一段数据抛弃
#include<bits/stdc++.h> using namespace std; int main(){ int N; cin >> N; vector<int> arr(N); for(int i = 0; i < N; i++){ cin >> arr[i]; } // int maxsum = arr[0]; int thissum = 0; for(int i = 0; i < N; i++){ thissum += arr[i]; if(thissum > maxsum) maxsum = thissum; if(thissum <= 0) thissum = 0; } cout << maxsum <<endl; return 0; }