题目:862. 和至少为 K 的最短子数组
思路:单调队列+前缀和
class Solution {
public:
int shortestSubarray(vector<int>& nums, int k) {
int n = nums.size();
vector<long> s(n+1,0);
for(int i=1;i<=n;++i){
s[i]=s[i-1]+nums[i-1];
//cout<<sums[i]<<endl;
}
deque<int> q;
int ans=n+1;
for(int i=0;i<=n;++i){
while(!q.empty() && s[i]-s[q.front()]>=k){
ans=min(ans,i-q.front());
q.pop_front();
}
while(!q.empty()&&s[q.back()]>=s[i]){
q.pop_back();
}
q.push_back(i);
}
if(ans==n+1) ans=-1;
return ans;
}
};