和至少为 K 的最短子数组
给你一个整数数组 nums 和一个整数 k ,找出 nums 中和至少为 k 的 最短非空子数组 ,并返回该子数组的长度。如果不存在这样的 子数组 ,返回 -1 。
子数组 是数组中 连续 的一部分。
class Solution {
public int shortestSubarray(int[] nums, int k) {
int n=nums.length,res=n+1;
LinkedList<Integer> list=new LinkedList<>();
long[] pre=new long[n+1];
for(int i=1;i<=n;i++)
pre[i]=pre[i-1]+(long)nums[i-1];
for(int i=0;i<n+1;i++)
{
while(!list.isEmpty()&&pre[i]<pre[list.getLast()])
list.removeLast();
while(!list.isEmpty()&&pre[i]-pre[list.getFirst()]>=k)
{
res=Math.min(res,i-list.removeFirst());
}
list.add(i);
}
return res==n+1?-1:res;
}
}