题目:
分析:
思路一:
分包含循环处和不包含两种:
不包含:就是平常的连续数组和。
包含:就是必包含两端,然后我觉得是nlogn就可得出。两重循环的解法。
思路二:
对于此题,循环的就是复制数组再加到其后,保障下标I,j的差小于N即可。
对题解的优先队列不太理解。
思路三:
就是找连续的最小值即可。
即 第一种的双区间,我们找到1,len()-2之间的最小值即可。
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
vector<int> A;
if(A.size()==0) return 0;
if(A.size()==1) return A[0];
if(A.size()==2) return max(max(A[0],A[1]),A[0]+A[1]);
//包含第i项的最大值
vector<int> A1=A;
int maxx=A[0];
for(int i=1;i<A.size();i++)
{
A1[i]=max(A1[i-1],0)+A[i];
maxx=max(maxx,A1[i]);
}
int sum=accumulate(A.begin(),A.end(),0);
int minn=A[1];
A1[1]=A[1];
if(A.size()!=3)
for(int i=2;i<A.size()-1;i++)
{
A1[i]=min(0,A1[i-1])+A[i];
minn=min(A1[i],minn);
}
return max(sum-minn,maxx);
}