最开始想错了,因为数组合并起来,然后使用dp来求算,没想到发现这个其实滑动窗口大小为n。所以毕竟还是也总牛逼
C++ 代码
class Solution {
public:
int maxSubarraySumCircular(vector<int>& A) {
int n=A.size();
for(int i=0;i<n;i++){
A.push_back(A[i]);
}
vector<int> sum(n*2+1);
for(int i=1;i<n*2+1;i++){
sum[i]=sum[i-1]+A[i-1];//计算前缀和
}
int res=INT_MIN;
deque<int> q;
q.push_back(0);
for(int i=1;i<=n*2;i++){
//弹出队首
if(q.size()&&i-n>q.front()){
q.pop_front();
}
if(q.size()){
res=max(res,sum[i]-sum[q.front()]);
}
while(q.size()&&sum[q.back()]>=sum[i]){
q.pop_back();
}
q.push_back(i);
}
return res;
}
};