传送门:https://leetcode.cn/problems/shortest-subarray-with-sum-at-least-k/
思路:前缀和+滑动窗口
先求出数组前缀和,问题就转变成前缀和之差不小于k的最小区间
利用滑动窗口维护一个合法区间,遍历 i =0 ->n,对于当前下标 j
对于右边窗口,若 i < j, pre[i]>=pre[j] ,显然可以将pre[i]从窗口中去除,利用 j 作为左区间显然更好
而对于左边窗口,pre[i]已经求得其最小区间,故可以将其从窗口去除
class Solution {
public:
int shortestSubarray(vector<int>& nums, int k) {
int n=nums.size(),res=n+1;
vector<pair<long long,int>> iv(nums.size()+1);
int l=0,r=0,t;
iv[r++]={0,-1};
long long sum=0,val;
for(int i=0;i<n;++i)
{
sum+=nums[i];
while(l<r&&iv[r-1].first>=sum){
--r;
}
iv[r++]={sum,i};
while(l<r&&iv[l].first+k<=sum){
++l;
}
if(l>0&&iv[l-1].first+k<=sum){
res=min(res,i-iv[l-1].second);
}
}
if(res==n+1){
res=-1;
}
return res;
}
};