Prime Subtraction Operation

MediumArrayMathBinary SearchGreedyNumber Theory

Solution

export function primeSubOperation(nums: number[]): boolean {
  const n = nums.length;
  const maxElement = nums.reduce((prev, num) => Math.max(prev, num), 0);
  const isValid = new Array<boolean>(maxElement + 1).fill(true);
  isValid[1] = false;
  for (let i = 2; i <= Math.sqrt(maxElement + 1); i++) {
    if (!isValid[i]) continue;
    for (let j = i * i; j <= maxElement; j += i) {
      isValid[j] = false;
    }
  }
 
  let currentValue = 1;
  let currentIndex = 0;
  while (currentIndex < n) {
    const difference = nums[currentIndex] - currentValue;
    if (difference < 0) {
      return false;
    }
    if (isValid[difference] || difference === 0) {
      currentIndex += 1;
    }
    currentValue += 1;
  }
  return true;
}

Complexity

  • n: nums의 길이, m: nums의 가장 큰 수
  • Time: O(n+mloglog(m)))O(n + m \cdot loglog(m)))
  • Space: O(m)O(m)