题解 | #丑数#

丑数

http://www.nowcoder.com/practice/6aa9e04fc3794f68acf8778237ba065b

33、丑数

解题思路:

我们先看到题目,把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。

有了上面的定义我们就可以知道,丑数的形式就是2x3y5z
所以我们可以定义一个数组res,存储第n个丑数。
因为我们要将丑数按从小到大的顺序排序,所以我们就得将对应的丑数放在对应的下标位置,小的放前面。
因为最小的丑数就是1,所以我们初始化res[0]=1,那么接下来的一个丑数是什么呢?我们自己知道是2。
但是我们能不能有一个格式,去将得到接下来的丑数是谁呢?
这个时候上面我们的出来的丑数的格式就起作用了,丑数的形式无非就是这样2x3y5z
所以我们就将res[n]去乘以 2、3、5,然后比较出最小的那个,就是我们当前的下一个丑数了。

33

代码:

public int GetUglyNumber_Solution(int index) {
        //1 2 3 4 5 6 8
        if(index <= 6)
            return index;   // 加快程序输出

        // 三个变量 后面有大作用!
        int i2 = 0,i3 = 0,i5 = 0;
        int[] res = new int[index];
        res[0] = 1;  // 第一个丑数为 1

        for(int i = 1; i < index; i++){
            // 得到下一个丑数,三者中最小的
            res[i] = Math.min(res[i2]*2,Math.min(res[i3]*3,res[i5]*5));
             /*第一次是 2、3、5比较,得到最小的是2*/
            /*第二次是 4、3、5比较,为什么是4了呢?因为上次2已经乘了一次了,所以接下去可以放的丑数在4、3、5之间*/
            // 所以开头的三个指针就是来标记2 3 5 乘的次数的 
            if(res[i] == res[i2]*2)
                i2++;
            if(res[i] == res[i3]*3)
                i3++;
            if(res[i] == res[i5]*5)
                i5++;
        }
        return res[index-1];
    }

上面说的可能有点小拗口,但是只要按照代码然后看上面的动图自己动手去理解,就可以很快的搞懂它了~

复杂度分析:

  • 时间复杂度:O(n)。取决于index值,循环中计算的次数为index。
  • 空间复杂度:O(n)。取决于数组res的大小。
剑指offer 文章被收录于专栏

为刷过的每一道题都书写一篇题解,便于重复练习~

全部评论
需要去重吧,当res[i] == res[i-1]时需要i--;退一位
点赞 回复 分享
发布于 2024-04-11 10:32 湖南
return index;// 加快程序输出 这里应该返回array[index]
点赞 回复 分享
发布于 2022-12-06 17:55 陕西
为什么会蹦出来9?
点赞 回复 分享
发布于 2022-04-17 00:18
没图真看不懂
点赞 回复 分享
发布于 2021-12-28 20:51
标记2.3.5哪里真的好绕啊!
点赞 回复 分享
发布于 2021-12-28 20:50

相关推荐

评论
68
6
分享

创作者周榜

更多
正在热议
更多
# 一张图晒出你司的标语 #
4234次浏览 75人参与
# AI面会问哪些问题? #
27302次浏览 545人参与
# 米连集团26产品管培生项目 #
13269次浏览 285人参与
# 你的实习产出是真实的还是包装的? #
19958次浏览 342人参与
# 找AI工作可以去哪些公司? #
8782次浏览 225人参与
# 春招至今,你的战绩如何? #
64037次浏览 575人参与
# 开放七大实习专项,百度暑期实习值得冲吗 #
14960次浏览 219人参与
# 从事AI岗需要掌握哪些技术栈? #
8671次浏览 293人参与
# 你做过最难的笔试是哪家公司 #
32715次浏览 223人参与
# 中国电信笔试 #
31617次浏览 284人参与
# 投递几十家公司,到现在0offer,大家都一样吗 #
340650次浏览 2173人参与
# 阿里笔试 #
178203次浏览 1311人参与
# 第一份工作一定要去大厂吗 #
14308次浏览 122人参与
# 金三银四,你的春招进行到哪个阶段了? #
22001次浏览 280人参与
# 沪漂/北漂你觉得哪个更苦? #
9691次浏览 193人参与
# HR最不可信的一句话是__ #
6123次浏览 113人参与
# 应届生第一份工资要多少合适 #
20651次浏览 86人参与
# AI时代,哪个岗位还有“活路” #
11346次浏览 339人参与
# 春招你拿到offer了吗 #
830934次浏览 9986人参与
# 长得好看会提高面试通过率吗? #
22418次浏览 254人参与
# 聊聊你的职场新体验 #
336392次浏览 1894人参与
# 学历对求职的影响 #
664972次浏览 4249人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务