【路飞】丑数、超级丑数

123 阅读1分钟

题目1:263. 丑数

image.png

解答

function isUgly(n) {
  if(n <= 0) {
    return false;
  }
  const nums = [2, 3, 5];
  for (const num of nums) {
    while (n % num === 0) {
        n /= num;
    }
  }
  return n == 1;
};

题目2:264. 丑数 II

image.png

解答

function nthUglyNumber(n) {
 let i2 = 0, i3 = 0, i5 = 0;
  let dp = [1];
  for (let i = 1; i < n; i++) {
    let m2 = dp[i2] * 2;
    let m3 = dp[i3] * 3;
    let m5 = dp[i5] * 5;
    let min = Math.min(m2, m3, m5);
    if (min === m2) i2++;
    if (min === m3) i3++;
    if (min === m5) i5++;
    dp[i] = min;
  }
  return dp[n - 1];
};

题目3: 313. 超级丑数

image.png

解答

function nthSuperUglyNumber(n, primes) {
  let arr = new Array(primes.length).fill(0);
  let dp = [1];
  for(let i = 1; i < n; i++) {
    let min = Number.MAX_SAFE_INTEGER;
    primes.forEach((k, index) => {
      min = Math.min(min, dp[arr[index]] * k);
    })
    primes.forEach((k, index) => {
      if(dp[arr[index]] * k === min) {
        arr[index]++
      }
    })
    dp[i] = min;
  }
  return dp[n - 1];
};