前綴和問題


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM