双向队列知识点: 【Java常用容器】Map+Set+栈+队列+List+StringBuilder_Roye_ack的博客-CSDN博客
class Solution {
public int shortestSubarray(int[] nums, int k) {
int n=nums.length;
long[] sum=new long[n+1];
for(int i=0;i<n;i++) sum[i+1]=sum[i]+nums[i]; // 计算前缀和
Deque<Integer> q=new ArrayDeque<>();
int ans=n+1;//ans记录满足要求的最小子串长度
for(int i=0;i<=n;i++)
{
while(!q.isEmpty()&&sum[i]-sum[q.peek()]>=k)
ans=Math.min(ans,i-q.poll()); //当满足X-sum[队头]≥k 此时的ans就是最优解了
//有最优解就可以扔掉队头了 因为后面再满足该条件 ans肯定比现在要大
//维护前缀和单调递增队列
while(!q.isEmpty()&&sum[i]<=sum[q.peekLast()])
q.pollLast();
q.offer(i);
}
return ans>n? -1:ans;
}
}