最大连续子段和
最大连续子段和
思路:
用两个变量 一个存放累计最大值 一个存放当前和 如果当前和小于0 则在这之前的数都pass掉 给当前和重新赋值时间复杂度O(n)
code:
#include<iostream> #include<cmath> using namespace std; const int N=2e5+5; int n; int a[N]; int maxs=-99999,thissum;//最大值与当前和 void getmax() { maxs=a[1];//最大值默认为第一个元素的值 thissum=a[1];//当前和也默认为第一个元素的值 for(int i=2;i<=n;i++) { thissum+=a[i];//当前和 累加 if(thissum<0) thissum=a[i];//如果当前和小于0 则放弃当前和 maxs=max(maxs,thissum);//判断最大值是否改变 } } int main() { cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; getmax(); cout<<maxs<<endl; return 0; }