Shortest Subarray with Sum at Least K

HardArrayBinary SearchQueueSliding WindowHeap (Priority Queue)Prefix SumMonotonic Queue

Solution

export function shortestSubarray(nums: number[], k: number): number {
  const n = nums.length;
  const prefix: number[] = new Array(n + 1).fill(0);
  for (let i = 0; i < n; i++) {
    prefix[i + 1] = prefix[i] + nums[i];
  }
 
  let answer = n + 1;
  const deque: number[] = [];
  for (let i = 0; i < n + 1; i++) {
    while (0 < deque.length && k <= prefix[i] - prefix[deque[0]]) {
      answer = Math.min(answer, i - deque.shift()!);
    }
    while (0 < deque.length && prefix[i] <= prefix[deque[deque.length - 1]]) {
      deque.pop();
    }
    deque.push(i);
  }
  return answer <= n ? answer : -1;
}

Complexity

  • Time: O(n)O(n)
  • Space: O(n)O(n)