掘金团队号上线,助你 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];
};