264. 丑数 II(JavaScript)
编写一个程序,找出第 n
个丑数。
丑数就是只包含质因数 2, 3, 5
的正整数。
示例:
输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
说明:
1
是丑数。n
不超过1690。
思路:
这道题是丑数Ⅱ,前一道题请看丑数 Ⅰ.
这里第一反应是利用丑数Ⅰ的函数,对于每个数都判断是否为丑数。但这样做,当n超过1000时就会超出时间限制,必须想出更块的算法。
当n=1000时,结果是51200000,时间复杂度最好是O(n)。直接算出每个丑数并保存在数组中,这样数组大小为n,时间复杂度刚好也是O(n)。问题在于如何算出丑数呢?
设置三个索引:a2、a3、a5,分别代表将要乘以2、3、5的丑数的索引。
从1到n,每次往数组加上的丑数为a2、a3、a5分别乘以2、3、5之后的最小值。
若新加的丑数是2、3或5的倍数,则将a2、a3或a5加一。
最后返回数组的最后一个元素。
/**
* @param {number} n
* @return {number}
*/
var nthUglyNumber = function(n) {
let a2 = a3 = a5 = 0; // 将要乘以2、3、5的数的索引
let ugly = [1];
for (let i = 1; i < n; ++i) {
ugly.push(Math.min(Math.min(ugly[a2] * 2, ugly[a3] * 3), ugly[a5] * 5));
if (ugly[i] / ugly[a2] === 2) ++a2;
if (ugly[i] / ugly[a3] === 3) ++a3;
if (ugly[i] / ugly[a5] === 5) ++a5;
}
return ugly[n-1];
};