返回

如何用 JavaScript 轻松征服 LeetCode 264:丑数 II?三指针算法,详细注释!

前端

如何轻松征服 LeetCode 264:丑数 II 的三指针算法(附 JavaScript 代码和详细注释)
欢迎来到 LeetCode 264 的攻略之旅,一个旨在揭开“丑数 II”之谜的算法挑战!本指南将深入剖析三指针算法,并通过 JavaScript 代码和详细注释,让你轻松驾驭这道难题。

何为“丑数”?

“丑数”是指仅包含质因子 2、3 和 5 的正整数。例如,1、2、3、4、5、6、8、9、10、12 等都是丑数。

三指针算法简介

三指针算法的精髓在于巧妙利用“丑数”的生成规律。具体来说,我们可以维护三个指针,分别指向当前序列中的乘数 2、3 和 5 的位置。然后,我们不断选择这三个乘数中最小的一个作为下一个丑数,并更新相应的指针位置。

JavaScript 代码

const nthUglyNumber = (n) => {
  // 丑数数组
  const ugly = [1];

  // 三个指针
  let i2 = 0;
  let i3 = 0;
  let i5 = 0;

  while (ugly.length < n) {
    // 获取当前乘数的最小值
    const min = Math.min(ugly[i2] * 2, ugly[i3] * 3, ugly[i5] * 5);

    // 添加最小值到丑数数组
    ugly.push(min);

    // 更新指针位置
    if (min === ugly[i2] * 2) i2++;
    if (min === ugly[i3] * 3) i3++;
    if (min === ugly[i5] * 5) i5++;
  }

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

详细注释

  • line 2: 初始化丑数数组 ugly
  • line 4-6: 初始化三个指针 i2i3i5
  • line 8-13: 循环生成丑数,直到数组长度达到 n
  • line 10: 获取当前乘数的最小值 min
  • line 12:min 添加到 ugly 数组。
  • line 14-19: 更新指针位置,使乘数与最小值保持同步。

使用示例

console.log(nthUglyNumber(10)); // 输出:12
console.log(nthUglyNumber(1)); // 输出:1
console.log(nthUglyNumber(1500)); // 输出:859963392

总结

三指针算法为 LeetCode 264 提供了一种简单高效的解决方案。通过利用丑数的生成规律,我们能够快速生成第 n 个丑数。通过这份详细的指南和 JavaScript 代码,你也可以轻松征服这道算法挑战!