返回

LeetCode题解:264. 丑数 II,暴力法,JavaScript,详细注释

前端

题解:264. 丑数 II

对于LeetCode题解:264. 丑数 II ,我们暴力法 ,用JavaScript编写了解答方案。

首先我们来看一道经典的面试题:

什么是丑数?

丑数是指只能被2、3、5整除 的正整数。

例如:

  • 1 是丑数,因为 1 = 1。
  • 2 是丑数,因为 2 = 2。
  • 3 是丑数,因为 3 = 3。
  • 4 不是丑数,因为 4 = 2^2。
  • 5 是丑数,因为 5 = 5。

求解丑数二的暴力方法

我们知道丑数只能被2、3、5整除。因此我们可以通过三层循环,不断地将2、3、5相乘,得到新的丑数。

然后将所有丑数从小到大排序,再取出第n个即可。

算法步骤:

  1. 定义变量i、j、k,分别存储2、3、5的倍数。
  2. 定义数组uglyNums存储所有丑数。
  3. 初始化丑数数组uglyNums,将1放入其中。
  4. 循环,直至uglyNums数组中的丑数数量达到n。
  5. 在每一步中,比较i、j、k的值,将最小的一个放入uglyNums数组中。
  6. 然后,将对应倍数的变量加1。
  7. 重复步骤5和步骤6,直到uglyNums数组中的丑数数量达到n。

复杂度分析

  • 时间复杂度:O(n log n)。
  • 空间复杂度:O(n)。

代码实现

/**
 * 返回第n个丑数
 * @param {number} n
 * @return {number}
 */
const nthUglyNumber = (n) => {
  if (n <= 0) {
    return 0;
  }

  // 定义变量i、j、k,分别存储2、3、5的倍数。
  let i = 0;
  let j = 0;
  let k = 0;

  // 定义数组uglyNums存储所有丑数。
  const uglyNums = [1];

  // 循环,直至uglyNums数组中的丑数数量达到n。
  while (uglyNums.length < n) {
    // 在每一步中,比较i、j、k的值,将最小的一个放入uglyNums数组中。
    const nextUglyNumber = Math.min(uglyNums[i] * 2, uglyNums[j] * 3, uglyNums[k] * 5);
    uglyNums.push(nextUglyNumber);

    // 然后,将对应倍数的变量加1。
    if (nextUglyNumber === uglyNums[i] * 2) {
      i++;
    } else if (nextUglyNumber === uglyNums[j] * 3) {
      j++;
    } else {
      k++;
    }
  }

  // 返回第n个丑数。
  return uglyNums[n - 1];
};

完整代码:

丑数 II

丑数是指只能被2、3、5整除的正整数。求解丑数 II 的暴力方法是使用三个嵌套循环,计算出所有可能的丑数。由于每层循环都是在上层循环的结果基础上进行计算,因此计算结果并未排序。将所有丑数从小到大排序,再取出第n个即可。

算法步骤

  1. 定义变量i、j、k,分别存储2、3、5的倍数。
  2. 定义数组uglyNums存储所有丑数。
  3. 初始化丑数数组uglyNums,将1放入其中。
  4. 循环,直至uglyNums数组中的丑数数量达到n。
  5. 在每一步中,比较i、j、k的值,将最小的一个放入uglyNums数组中。
  6. 然后,将对应倍数的变量加1。
  7. 重复步骤5和步骤6,直到uglyNums数组中的丑数数量达到n。

代码实现

/**
 * 返回第n个丑数
 * @param {number} n
 * @return {number}
 */
const nthUglyNumber = (n) => {
  if (n <= 0) {
    return 0;
  }

  // 定义变量i、j、k,分别存储2、3、5的倍数。
  let i = 0;
  let j = 0;
  let k = 0;

  // 定义数组uglyNums存储所有丑数。
  const uglyNums = [1];

  // 循环,直至uglyNums数组中的丑数数量达到n。
  while (uglyNums.length < n) {
    // 在每一步中,比较i、j、k的值,将最小的一个放入uglyNums数组中。
    const nextUglyNumber = Math.min(uglyNums[i] * 2, uglyNums[j] * 3, uglyNums[k] * 5);
    uglyNums.push(nextUglyNumber);

    // 然后,将对应倍数的变量加1。
    if (nextUglyNumber === uglyNums[i] * 2) {
      i++;
    } else if (nextUglyNumber === uglyNums[j] * 3) {
      j++;
    } else {
      k++;
    }
  }

  // 返回第n个丑数。
  return uglyNums[n - 1];
};

复杂度分析

  • 时间复杂度:O(n log n)。
  • 空间复杂度:O(n)。

结语

以上就是LeetCode题解:264. 丑数 II 的暴力法解法,希望对您有所帮助。如果您有其他问题,请随时留言。