1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| class Solution { public int shortestSubarray(int[] nums, int k) { int minLength = Integer.MAX_VALUE;
long[] prefixSumArray = new long[nums.length + 1]; for (int i = 1; i < prefixSumArray.length; i++) { prefixSumArray[i] = prefixSumArray[i - 1] + nums[i - 1]; }
Deque<Integer> increaseDeque = new LinkedList<>(); for (int i = 0; i < prefixSumArray.length; i++) { long prefixSum = prefixSumArray[i];
while (!increaseDeque.isEmpty() && prefixSum - prefixSumArray[increaseDeque.getFirst()] >= k) { minLength = Math.min(minLength, i - increaseDeque.pollFirst()); } while (!increaseDeque.isEmpty() && prefixSum <= prefixSumArray[increaseDeque.getLast()]) { increaseDeque.pollLast(); }
increaseDeque.addLast(i); }
return minLength == Integer.MAX_VALUE ? -1 : minLength; } }
|
注意该题数组元素可能含有负数,所以不能使用常规的滑动窗口解题,如:[84, -37, 32, 40, 95],k = 167,若使用常规的滑动窗口则无法将 -37 移除窗口。
References
862. Shortest Subarray with Sum at Least K