前缀和问题

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

 

转载于:https://www.cnblogs.com/lweccci/p/11443309.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值