前缀和问题

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;
}

 

posted @ 2019-09-01 19:35  night9zzzz  阅读(826)  评论(0编辑  收藏  举报