[LeetCode 264. 丑数 II]|刷题打卡

118 阅读1分钟

掘金团队号上线,助你 Offer 临门! 点击 查看详情

题目描述

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

丑数:是指只包含质因数 2、3 和/或 5 的正整数。

示例

示例 1:

输入:n = 10
输出:12
解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。

示例 2:

输入:n = 1
输出:1
解释:1 通常被视为丑数。

限制:

1 <= n <= 1690

解题思路

首先创建一个数组 arr 用来存储当前排列好的所有丑数。根据丑数的特征,新的丑数必然是根据已有的丑数,去乘以2、3 或 5 得到的。

创建三个指针 n1,n2,n3。

每次计算出三个新的丑数,把其中最小的一个放进数组里:

num1:arr[n1]*2
num2: arr[n2]*3
num3: arr[n3]*5

假如 num1 最小,将 num1 放进数组 arr 中,指针 n1 右移。

很明显 num2 跟 num3 也是需要放进数组中的丑数,但是由于数组是有序的,所以它们需要跟新的 num1 进行比较,于是指针保持不动。

考虑特殊情况:num2 与 num1 相等的话,由于数组不能有重复项,所以这种情况指针 n2 也应该右移。

代码

/**
 * @param {number} n
 * @return {number}
 */
var nthUglyNumber = function(n) {
    let arr = [1];
    let n1=0, n2=0, n3=0;

    for (let i = 1; i < n; i++) {
        arr[i] = Math.min(2*arr[n1], 3*arr[n2], 5*arr[n3]);
        if (arr[i] === 2*arr[n1]) n1++;
        if (arr[i] === 3*arr[n2]) n2++;
        if (arr[i] === 5*arr[n3]) n3++;
    }

    return arr[n-1];
};