918. 环形子数组的最大和

 

 1 //数组是连续的
 2 class Solution 
 3 {
 4 public:
 5     int maxSubarraySumCircular(vector<int>& A) 
 6     {
 7         // 单调队列
 8         int n = A.size();
 9         deque<int> q;
10         for(int i = 0; i < n; i++) A.push_back(A[i]);
11         vector<int> s(2 * n + 1);
12         // 计算前缀和
13         
14         for(int i = 1; i <= 2 * n; i++)
15         {
16             s[i] = s[i- 1] + A[i-1];
17         }
18         // 初始化队列
19         q.push_back(0);
20         int res = INT_MIN;
21     
22         for(int i = 1; i <= 2 * n; i++)
23         {
24             if(q.size() && i - n > q.front()) q.pop_front();
25             if(q.size()) res = max(res, s[i] - s[q.front()]);
26             while(q.size() && s[q.back()] > s[i]) q.pop_back();
27             q.push_back(i);
28         }
29         return res;
30     }
31 };

 

posted @ 2020-04-08 22:50  Jinxiaobo0509  阅读(171)  评论(0)    收藏  举报