lintcode-4.丑数

225 阅读1分钟

描述

如果一个数只有质数因子235 ,那么这个数是一个丑数。

前10个丑数分别为 1, 2, 3, 4, 5, 6, 8, 9, 10, 12...设计一个算法,找出第N个丑数。

我们可以认为 1 也是一个丑数。

1≤n≤105

样例 1:

输入:

n = 9

输出:

10

解释:

[1,2,3,4,5,6,8,9,10,....],第9个丑数为10。

样例 2:

输入:

n = 1

输出:

1

挑战

要求时间复杂度为 O(nlogn) 或者 O(n)。

题解

思路

结论:当前丑数必定是之前某个丑数 的 2倍、3倍、或者 5倍。 定义一个数组result存放丑数,默认第一个丑数是1。那么当前丑数一定是result数组中在他之前的丑数的2,3,5倍中最小的一个,当然这个值一定是大于result[length-1]的最小值。 result[1]=min(2result[0-length-1],3result[0-length-1],5*[0-length-1])

分别用2,3,5乘1寻找第二个丑数,得到最小值2作为第二个丑数即num[1]=2。

第三个丑数: 大于2且在21 31 51 22 32 52中的最小是==》3

4.以此类推找到第n个最小值为第n个丑数。

代码

const nthUglyNumber = function (n) {
var result = [1];
var i, t, nextchoushu;
while (result.length < n) {
    // 当前已经计算出来的丑数的最后一个
    t = result[result.length - 1];
    // 最后一个丑数*2
    nextchoushu = t * 2;
    // 遍历已经计算出来的丑数
    for (i = 0; i < result.length; i++) {
        // 
        if (result[i] * 2 > t) {
            nextchoushu = Math.min(result[i] * 2, nextchoushu);
        }
    }
    for (i = 0; i < result.length; i++) {
        if (result[i] * 3 > t) {
            nextchoushu = Math.min(result[i] * 3, nextchoushu);
        }
    }
    for (i = 0; i < result.length; i++) {
        if (result[i] * 5 > t) {
            nextchoushu = Math.min(result[i] * 5, nextchoushu);
        }
    }
    result.push(nextchoushu);
}
return result[n - 1];
}