Shortest Subarray With OR at Least K II

MediumArrayBit ManipulationSliding Window

Solution

export function minimumSubarrayLength(nums: number[], k: number): number {
  const n = nums.length;
  const bitCounts = new Array<number>(32).fill(0);
 
  let [start, end] = [0, 0];
  let minLength = Number.MAX_SAFE_INTEGER;
  while (end < n) {
    updateBitCounts(bitCounts, nums[end], 1);
    while (start <= end && k <= convertBitsToNum(bitCounts)) {
      minLength = Math.min(minLength, end - start + 1);
      updateBitCounts(bitCounts, nums[start], -1);
      start += 1;
    }
    end += 1;
  }
  return minLength === Number.MAX_SAFE_INTEGER ? -1 : minLength;
}
 
function updateBitCounts(bitCounts: number[], num: number, delta: number): void {
  for (let i = 0; i < bitCounts.length; i++) {
    if (num & (1 << i)) {
      bitCounts[i] += delta;
    }
  }
}
 
function convertBitsToNum(bitCounts: number[]): number {
  let result = 0;
  for (let i = 0; i < bitCounts.length; i++) {
    if (bitCounts[i]) {
      result = result | (1 << i);
    }
  }
  return result;
}

Complexity

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