class Solution {
public int shortestSubarray(int[] A, int K) {
int n = A.length;
int[] prefixSum = new int[n + 1];
for (int i = 0; i < n; i++) {
prefixSum[i + 1] = prefixSum[i] + A[i];
}
Deque<Integer> deque = new ArrayDeque();
int res = n + 1;
for (int i = 0; i <= n; i++) {
// 找到符合条件subarray, 更新res
while (deque.size() > 0 && prefixSum[i] - prefixSum[deque.getFirst()] >= K) {
res = Math.min(res, i - deque.removeFirst());
}
// i > deque.getLast(), 如果prefixSum[i] <= prefixSum[deque.getLast()], 说明[deque.getLast(), i]之间出现0或负数
// 说明prefixSum[i]能让最后的subarray sum更大,同时使得符合条件的subarray长度更短,所以我们可以删除dequeu.getLast()
while (deque.size() > 0 && prefixSum[i] <= prefixSum[deque.getLast()]) {
deque.removeLast();
}
deque.addLast(i);
}
return res <= n ? res : -1;
}
}