class Solution {
public:int shortestSubarray(vector& nums, int k) {int n = nums.size();vector pre(n+1);//大小为n+1的一位堆空间prefor(int i = 1;i<=n;i++){pre[i]=pre[i-1] + nums[i-1];//生成前缀和数组,大小为n+1,从pre[0]=0开始。}int ans = n+1;deque qu;//双端队列for(int i = 0;i<=n;i++){//初始情况,qu为空,0号位置直接入队while(!qu.empty()&&pre[i]-pre[qu.front()]>=k){//当前位置前缀和-队首前缀和>=kans = min(ans,i-qu.front());//判断最小长度qu.pop_front();}while(!qu.empty()&&pre[i]<=pre[qu.back()]){//当前位置前缀和<=队尾前缀和qu.pop_back();}qu.push_back(i);//每次循环,当前位置入队尾}return ans >= n+1?-1:ans;//不存在,返回-1//存在,返回长度}
};