剑指offer 50. 丑数

简介: 剑指offer 50. 丑数

题目描述

我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。

例如 6、8 都是丑数,但 14 不是,因为它包含质因子 7。

求第 n 个丑数的值。


数据范围

1≤n≤1000

样例

输入:5
输出:5
• 1
• 2
• 3

注意:习惯上我们把 1 当做第一个丑数。



方法一:动态规划 O(n)

我们可以利用多路归并思想,动态的更新值。


假设一个序列 S ,其中包含了所有丑数即只包含质因子 2 、3 和 5 的数。那么如果那么现在有三个序列,这三个序列分别只包含质因子 2 、3 和 5 的数,则这三个序列并集就等于序列 S 。所以我们可以用三个指针分别指向这三个序列的第一个元素,每次都只取这三个指针指向的最小值加入答案数组,并将该指针往后移,直到得到第 n 个丑数。


我们可以对上述思路进行优化,只用一个数组来存储得到的丑数,三个指针指向开头,每得到一个最小值就加入该数组末尾,然后将指针后移一位再进行比较,这样可以保证所有数都不会被忽略。我们拿题目的样例 n = 5 举例,来看看具体的思路是如何:


第一步: 先将 1 加入数组中,因为这是一个特殊的样例,需要进行初始化,且将 i 、j 和 k 都指向 q[0] 。其中 i 用于指向只包含质因数 2 的序列,j 则指向只包含质因数 3 的序列,k 则指向只包含质因数 5 的序列。

bceb7b53e9384bb084c8c84a6e6eeb95.png


第二步: 从三个指针指向的元素中取最小值,即 t = m i n ( 1 ∗ 2 , 1 ∗ 3 , 1 ∗ 5 ) = m i n ( 2 , 3 , 5 ) = 2 ,故将 i 往后移一位。

6271748e7d244fc0be493a70e09e489e.png



第三步: 从三个指针指向的元素中取最小值,即 t = m i n ( 2 ∗ 2 , 1 ∗ 3 , 1 ∗ 5 ) = m i n ( 4 , 3 , 5 ) = 3 t = min(2 * 2 , 1 * 3 , 1 * 5)=min(4,3,5)=3t=min(2∗2,1∗3,1∗5)=min(4,3,5)=3 ,故将 j 往后移一位。


f7e87e4853634e8c84599a6c46613ff3.png


第四步: 从三个指针指向的元素中取最小值,即 t = m i n ( 2 ∗ 2 , 2 ∗ 3 , 1 ∗ 5 ) = m i n ( 4 , 6 , 5 ) = 4 故将 i 往后移一位。


2456b18b228040b88570f5dee62cedd7.png


第五步: 从三个指针指向的元素中取最小值,即 t = m i n ( 3 ∗ 2 , 1 ∗ 3 , 1 ∗ 5 ) = m i n ( 6 , 6 , 5 ) = 5 故将 k 往后移一位。


2983b03dc6d1423aa30fbc6aaaf0f09c.png


第六步: 此时容器中已经有 5 个元素,直接返回最后一个元素 5 即可。

class Solution {
public:
    int getUglyNumber(int n) {
        vector<int> q(1, 1); //初始化第一个丑数1
        int i = 0, j = 0, k = 0;
        while (--n)
        {
            int t = min(q[i] * 2, min(q[j] * 3, q[k] * 5));
            q.push_back(t);
            if (q[i] * 2 == t) i++;
            if (q[j] * 3 == t) j++;
            if (q[k] * 5 == t) k++;
        }
        return q.back();
    }
};



欢迎大家在评论区交流~

目录
相关文章
|
3月前
|
SQL Java 数据库连接
updateByPrimaryKeySelective()方法因字段为null导致的更新不成功问题解决办法
为了让这个解决方案更容易融入到现有系统中,其实现应该尽量简单且无缝,避免重复代码,并提高代码复用性。结合上述方法中提供的策略,应可以解决在使用 `updateByPrimaryKeySelective()`方法时因字段为null导致的更新不成功问题。请根据实际业务需求和上下文选择最合适的方案。这样的解决方案能够达到更佳的代码质量和维护性。
302 14
|
缓存 关系型数据库 MySQL
MySQL Buffer Pool 解析:原理、组成及作用
MySQL Buffer Pool 解析:原理、组成及作用
|
关系型数据库 MySQL Linux
error: Failed dependencies: libncurses.so.5()(64bit) is needed by mysql-community-client-8.0.36-1.el7.x86_64 libtinfo.so.5()(64bit) is needed by mysql-community-client-8.0.36-1.el7.x86_64 如何解决?
error: Failed dependencies: libncurses.so.5()(64bit) is needed by mysql-community-client-8.0.36-1.el7.x86_64 libtinfo.so.5()(64bit) is needed by mysql-community-client-8.0.36-1.el7.x86_64 如何解决?
1952 3
|
JSON Java 数据格式
java里json常见的转换方法
java里json常见的转换方法
673 0
|
算法 Java
Java面试题:哪些对象可以作为GC Roots?
Java面试题:哪些对象可以作为GC Roots?
|
4天前
|
弹性计算 人工智能 安全
云上十五年——「弹性计算十五周年」系列客户故事(第二期)
阿里云弹性计算十五年深耕,以第九代ECS g9i实例引领算力革新。携手海尔三翼鸟、小鹏汽车、微帧科技等企业,实现性能跃升与成本优化,赋能AI、物联网、智能驾驶等前沿场景,共绘云端增长新图景。
|
10天前
|
存储 弹性计算 人工智能
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
2025年9月24日,阿里云弹性计算团队多位产品、技术专家及服务器团队技术专家共同在【2025云栖大会】现场带来了《通用计算产品发布与行业实践》的专场论坛,本论坛聚焦弹性计算多款通用算力产品发布。同时,ECS云服务器安全能力、资源售卖模式、计算AI助手等用户体验关键环节也宣布升级,让用云更简单、更智能。海尔三翼鸟云服务负责人刘建锋先生作为特邀嘉宾,莅临现场分享了关于阿里云ECS g9i推动AIoT平台的场景落地实践。
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
|
2天前
|
云安全 人工智能 安全
Dify平台集成阿里云AI安全护栏,构建AI Runtime安全防线
阿里云 AI 安全护栏加入Dify平台,打造可信赖的 AI