Return the length of the shortest, non-empty, contiguous subarray of A with sum at least K.
If there is no non-empty subarray with sum at least K, return -1.
Example 1:
Input: A = [1], K = 1
Output: 1
Example 2:
Input: A = [1,2], K = 4
Output: -1
Example 3:
Input: A = [2,-1,2], K = 3
Output: 3
Note:
1 <= A.length <= 50000
-10 ^ 5 <= A[i] <= 10 ^ 5
1 <= K <= 10 ^ 9
代码
Approach #1 Sliding Window
Time: O(N) && Space: O(N)
classSolution {publicintshortestSubarray(int[] A,int K) {int N =A.length;long[] P =newlong[N +1];for (int i =0; i < N; i++) {P[i +1] =P[i] + (long)A[i]; // prefix sum }int ans = N +1;Deque<Integer> monoq =newLinkedList();for (int y =0; y <P.length; y++) {while (!monoq.isEmpty() &&P[y] <=P[monoq.getLast()]) {monoq.removeLast(); // decreasing sequence }while (!monoq.isEmpty() &&P[y] >=P[monoq.getFirst()] + K) { ans =Math.min(ans, y -monoq.removeFirst()); }monoq.addLast(y); }return ans < N +1? ans :-1; }}
#2
publicintshortestSubarray(int[] A,int K) {int N =A.length;int res = N +1;int[] B =newint[N +1];for (int i =0; i < N; i++) B[i +1] =B[i] +A[i];Deque<Integer> d =newArrayDeque<>();for (int i =0; i < N +1; i++) {while (d.size() >0&&B[i] -B[d.getFirst()] >= K) res =Math.min(res, i -d.pollFirst());while (d.size() >0&&B[i] <=B[d.getLast()])d.pollLast();d.addLast(i); }return res <= N ? res :-1;}