[路飞]_264. 丑数 II

133 阅读2分钟

「这是我参与2022首次更文挑战的第8天,活动详情查看:2022首次更文挑战

264. 丑数 II

给你一个整数 n ,请你找出并返回第 n丑数

丑数 就是只包含质因数 23 和/或 5 的正整数。

「示例1:」
输入:n = 10
​
输出:12
​
解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。
「示例2:」
输入:n = 1
​
输出:1
​
解释:1 通常被视为丑数。
「示例3:」
输入:n = 4
​
输出:4
​
解释:[1, 2, 3, 4] 通常被视为丑数。
提示:
1. 1 <= n <= 1690

解题思路

1. 由题目可以得出丑数 就是只包含质因数 `2``3` 和/或 `5` 的正整数
​
2. 同时因为丑书的第一个数默认是`1`,所以我们需要生成一个默认的丑数数组,默认值第一个值是1
​
3. 我们可以生成三个指针为0的数,并且生成三个初始值为0的数,然后用2、3、5分别乘以然后取出最小值
​
4. 然后循环n次,生成一个n个数组成的丑书数组
​
5.返回数组的第n-1个值即可

代码实现

/**
 * 264. 丑数 II
 * @param {number} n
 * @return {number}
 */
var nthUglyNumber = function (n) {
  let arr = [1]; // 丑书数组,默认值第一个丑书为1
​
  let cur2 = 0,
    cur3 = 0,
    cur5 = 0; // 2 3 5每个值的指针
  let num2 = 0,
    num3 = 0,
    num5 = 0; // 2 3 5每个值的初始值
​
  for (let i = 1; i < n; i++) { // 循环n次生成n个丑书数组
    num2 = arr[cur2] * 2; // 获取乘以2的值
    num3 = arr[cur3] * 3; // 获取乘以3的值
    num5 = arr[cur5] * 5; // 获取乘以4的值
​
    let min = Math.min(num2, num3, num5); // 取出最小值
​
    arr.push(min); // 最小值放入数组
​
    if (min == num2) cur2++; //如果获取该数字下的最小值 它的指针 + 1
    if (min == num3) cur3++; //如果获取该数字下的最小值 它的指针 + 1
    if (min == num5) cur5++; //如果获取该数字下的最小值 它的指针 + 1
  }
  // console.log(arr);
  return arr[n - 1]; // 最后返回数组的第n - 1个值即可
};

如果你对这道题目还有疑问的话,可以在评论区进行留言;