题目描述 环形子数组的最大和 AC代码 /* 一个环弄成是长度为2n的链。 转化成滑动窗口求极值的问题 */ 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(2*n+1); for(int i=1;i<=2*n;i++) sum[i]=sum[i-1]+A[i-1]; int res=INT_MIN; deque<int> queue; queue.push_back(0); for(int i=1;i<=2*n;i++){ //这里之所以是大于,而不是大于等于,是因为前缀和sum[j]-sum[i]求的是i+1~j这一段的 if(queue.size()&&i-n>queue.front()) queue.pop_front(); if(queue.size()) res=max(res,sum[i]-sum[queue.front()]); while(queue.size()&&sum[queue.back()]>=sum[i]) queue.pop_back(); queue.push_back(i); } return res; } };