丑数(剑指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数组

相关文章
|
4月前
|
人工智能 Java 大数据
Java程序员真的还有未来吗?如何备战2024春招?并狂拿大厂offer?
Java程序员还有未来吗? 嘿,小伙伴们,你们有没有想过Java程序员还有没有未来? 哈哈,别担心,我这就来给你们答疑解惑! 首先,让我们来看看Java的发展历程。自从Java诞生以来,它就一直是编程界的一颗璀璨明星。从Web应用到企业级应用,再到移动应用,Java无处不在。那么,现在呢?现在,随着人工智能、大数据和云计算的兴起,Java依然发挥着重要的作用。这些领域都需要大量的Java程序员来支持它们的发展。 那么,有人会说:“哎呀,现在出现了那么多新的编程语言和框架,Java程序员会不会被淘汰啊?”哈哈,别担心,Java程序员们!这些新语言和框架的出现并不会让Java消失。相反,它们
81 0
|
4月前
|
NoSQL Dubbo Java
唯品会三年,我只做了5件事,如今跳槽天猫拿下offer(Java岗)
xxx,都是好牌子,天天有三折” 是的,我在这家洗脑广告词公司里工作了整整三年时间,虽然是大家耳熟能详的互联网电商公司,但它的发展同其他新起互联网公司来说局限了很多,同时也早早遇到了瓶颈。好在三年前,我就开始规划了我自己的人生,所以在唯品会的三年时间里,我并未懈怠。
|
4月前
|
消息中间件 NoSQL Java
读完这些“Java技术栈”,拿下阿里Offer没问题
今天,要分享的这些是非常干货的面试知识,在疫情闭关期间,这些“Java技术栈”读完,斩获offer到手软。
|
4月前
|
SQL Java 关系型数据库
疫情之后,幸获内推,4面京东拿下offer(Java后台研发岗)
在2019年时,就早早生了跳槽的念头,心想着拿完年终奖就要开始“跑路”,但万万没想到过完春节之后竟被疫情耽搁了这么久,导致很多互联网公司的招聘都往后一拖再拖。幸运的是,刚复工之后,就收到了朋友的消息,有京东内推的机会,问我要不要试一试,虽然说之前的目标是BAT,但根据自己目前情况来说,可能拿个京东也算是不错了,于是着手准备起来。
|
4月前
|
NoSQL 安全 Java
三面阿里被挂,竟获内推名额,历经5面拿下口碑offer(Java后台)
每一个互联网人心中都有一个大厂梦,百度、阿里巴巴、腾讯是很多互联网人梦寐以求的地方,而我也不例外。但是,BAT等一线互联网大厂并不是想进就能够进的,它对人才的技术能力和学历都是有一定要求的,所以除了学历以外,我们的技术和能力都要过硬才行。
|
4月前
|
安全 NoSQL Java
从安卓转到Java开发,我吃透了这份pdf,终于4面拿下美团offer
先说说个人情况吧,坐标广州,16年从一所普通二本大学毕业,毕业后在一家小公司干android开发,年薪在15w左右。转Java的契机是认识到了一个朋友,做Java后台的,经常跟他聊相关的内容,经过慎重考虑及个人的发展规划,所以就决定转型了。
|
4月前
|
NoSQL 安全 Java
差点跳起来了!全靠这份999页Java面试宝典,我刚拿到美团offer
事情是这样的,今年年初,在某个大博主那里拿到一份Java面试宝典,然后就一直躺在盘里吃灰,直到5月份的时候,有了要跳槽的计划和打算,就想着要刷刷面试题,所以就把这套“积灰”的面试宝典拿出看了看,这一看就看了一个多月才算是完整的吃透。7月中旬开始面试美团了,前后差不多5面的样子,原本以为没啥希望,等到月底29号收到了offer,通知8月3号到公司报到,看到邮件那一刻差点跳起来了!
|
5月前
|
Java C++
【剑指offer】-替换空格-02/67(JAVA版本未写)
【剑指offer】-替换空格-02/67(JAVA版本未写)
|
5月前
|
负载均衡 网络协议 Java
二面蚂蚁金服(交叉面),已拿offer,Java岗定级阿里P6
记一次蚂蚁金服Java程序员面试经历(均为交叉面)
|
5月前
|
NoSQL Dubbo Java
网易开发三年,现跳槽蚂蚁花呗,4面顺利通过,拿下Java岗offer
不论是校招还是社招都避免不了各种面试、笔试,如何去准备这些东西就显得格外重要。 运筹帷幄之后,决胜千里之外!不打毫无准备的仗,我觉得大家可以先从下面几个方面来准备面试: