丑数(剑指offer 49)Java动态规划

简介: 我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。

一、题目描述



我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。


示例:

输入: n = 10

输出: 12

解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。


说明:  

1 是丑数。

n 不超过1690。


二、思路讲解


       

首先可以想到,所有的丑数都是由前面的丑数乘上2、3或5得来的。而我们需要有顺序的丑数序列,就有必要知道,前面的数乘上2、3或5之后的数谁大谁小。因此,我们可以设置三个指针a、b、c;指针a表示所指的数还没有乘2,指针b表示所指的数还没有乘3,指针c表示所指的数还没有乘5。那么下一个丑数就应该是min{dp[a]*2, dp[b]*3, dp[c]*5},然后对应的指针后移。比如说,如果最小的值为dp[a]*2,那么下一个丑数就是dp[a]*2,那么a指针就后移(移到没有乘过2的数上面,也就是下一个数),然后dp[i-1]即为第i个丑数。


三、Java代码实现



class Solution {
    public int nthUglyNumber(int n) {
        int []dp = new int[2000];
        dp[0] = 1;
        int a=0, b=0, c=0;
        int count = 1;
        while(count <= n){
            int temp = Math.min(Math.min(dp[a]*2, dp[b]*3), dp[c]*5);
            dp[count++] = temp;
            //这里需要特别注意,有可能出现该丑数既等于dp[a]*2又等于dp[b]*3的情况
            //此时a指针和b指针都应该后移,所以不能写成else if,必须是三个if
            if(temp == dp[a]*2){
                a++;
            }
            if(temp == dp[b]*3){
                b++;
            }
            if(temp == dp[c]*5){
                c++;
            }
        }
        return dp[n-1];
    }
}



四、时空复杂度分析



时间复杂度:        O(N)        需要遍历dp数组

空间复杂度:        O(N)        需要一个dp数组

相关文章
|
6月前
|
Java
0-1背包问题(Java详解)(动态规划)至少与恰好
0-1背包问题(Java详解)(动态规划)至少与恰好
57 1
|
6月前
|
人工智能 Java 大数据
Java程序员真的还有未来吗?如何备战2024春招?并狂拿大厂offer?
Java程序员还有未来吗? 嘿,小伙伴们,你们有没有想过Java程序员还有没有未来? 哈哈,别担心,我这就来给你们答疑解惑! 首先,让我们来看看Java的发展历程。自从Java诞生以来,它就一直是编程界的一颗璀璨明星。从Web应用到企业级应用,再到移动应用,Java无处不在。那么,现在呢?现在,随着人工智能、大数据和云计算的兴起,Java依然发挥着重要的作用。这些领域都需要大量的Java程序员来支持它们的发展。 那么,有人会说:“哎呀,现在出现了那么多新的编程语言和框架,Java程序员会不会被淘汰啊?”哈哈,别担心,Java程序员们!这些新语言和框架的出现并不会让Java消失。相反,它们
137 0
|
5月前
|
Java
剑指offer_3_前n个数字二进制形式中1的个数(java)
剑指offer_3_前n个数字二进制形式中1的个数(java)
|
5月前
|
Java
剑指offer_2_二进制加法(java)
剑指offer_2_二进制加法(java)
|
5月前
|
Java
剑指offer_1_整数除法(java)
剑指offer_1_整数除法(java)
|
5月前
|
算法 Java 决策智能
Java数据结构与算法:动态规划之背包问题
Java数据结构与算法:动态规划之背包问题
|
6月前
|
存储 安全 Java
剑指offer全集系列Java版本(2)
剑指offer全集系列Java版本(2)
36 0
|
6月前
|
存储 Java
剑指offer全集系列Java版本(1)
剑指offer全集系列Java版本(1)
42 0
|
6月前
|
算法 Java C++
刷题两个月,从入门到字节跳动offer丨GitHub标星16k+,美团Java面试题
刷题两个月,从入门到字节跳动offer丨GitHub标星16k+,美团Java面试题
|
6月前
|
消息中间件 NoSQL Java
读完这些“Java技术栈”,拿下阿里Offer没问题
今天,要分享的这些是非常干货的面试知识,在疫情闭关期间,这些“Java技术栈”读完,斩获offer到手软。