lintcode-4.丑数

简介: lintcode-4.丑数

描述

如果一个数只有质数因子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];
}

相关文章
|
1月前
【LeetCode 17】5.7四数之和
【LeetCode 17】5.7四数之和
31 1
|
3月前
|
算法
LeetCode第18题四数之和
该文章介绍了 LeetCode 第 18 题四数之和的解法,与三数之和类似,通过先排序,再用双指针确定坐标并去重的方式解决,关键是确定四个坐标,前两个通过两层循环确定,后两个通过首尾双指针确定,同时总结了双指针可减少循环次数,使解决方式更简单高效。
LeetCode第18题四数之和
|
6月前
[leetcode] 四数之和 M
[leetcode] 四数之和 M
|
6月前
|
Java 测试技术 C++
leetcode-18:四数之和
leetcode-18:四数之和
44 0
leetcode每日一题 2021/4/10 263. 丑数
leetcode每日一题 2021/4/10 263. 丑数
47 0
|
算法 安全 Swift
LeetCode - #18 四数之和
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
leetcode:18.四数之和
这题和前面的一道三数之和类似,解题的思路都一样,这里直接选取两个基准就可以了,然后循环出所有的组合进行判断,如果正好相等那么就加入Set集合中。
60 0
|
人工智能 算法 Java
四数之和 (LeetCode 18)
四数之和 (LeetCode 18)
201 0
|
算法 前端开发 程序员
「LeetCode」剑指Offer-49丑数
「LeetCode」剑指Offer-49丑数
110 0
「LeetCode」剑指Offer-49丑数