const int N = 6e4 + 10, INF = 1e9;
class Solution {
public:
int s[N] = {0};
deque<int> qmin;//前缀和从小到大的双端队列
int maxSubarraySumCircular(vector<int>& nums) {
int n = nums.size();
vector<int>nums2;
nums2.push_back(0);
for(int i = 0; i < n; i ++) //将环形转化为线性
nums2.push_back(nums[i]);
for(int i = 0; i < n; i ++)
nums2.push_back(nums[i]);
n = nums2.size();
for(int i = 1; i < n; i ++) //计算前缀和
s[i] = s[i - 1] + nums2[i];
int res = -INF;
// qmin.push_back(0);
for(int i = 1; i < n; i ++)
{
while(!qmin.empty() && i - qmin.front() > (n - 1) / 2) //相差超过原始数组,队首过期
qmin.pop_front();
if(!qmin.empty())
{
// cout <<i << " i -> si" << s[i]<< s[i] - s[qmin.front()] << endl;
res = max(res, s[i] - s[qmin.front()]);
}
while(!qmin.empty() && s[qmin.back()] >= s[i]) // 队尾的数大于当前前缀和
qmin.pop_back();
qmin.push_back(i);
}
return res;
}
};
LeetCode 918. 环形子数组的最大和
最新推荐文章于 2022-08-31 20:47:31 发布