码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 剑指offer 丑数(dp、指针)


    nowcoder 题目链接
    leetcode 题目链接

    描述

    把只包含质因子 2 2 2、 3 3 3 和 5 5 5 的数称作丑数(Ugly Number)。例如 6 6 6、 8 8 8 都是丑数,但 14 14 14 不是,因为它包含质因子 7 7 7。 习惯上我们把 1 1 1 当做是第一个丑数。求按从小到大的顺序的第 n n n 个丑数。

    数据范围: 0 ≤ n ≤ 2000 0 \le n \le 2000 0≤n≤2000
    要求:空间复杂度 O ( n ) O(n) O(n) , 时间复杂度 O ( n ) O(n) O(n)

    输入:7
    返回值:8
    //解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
    
    • 1
    • 2
    • 3

    思路一

    直接三叉树暴搜复杂度必然是指数级别,首先想到一个小优化:例如 12 12 12,在三叉搜索树中会以 2 ∗ 2 ∗ 3 2*2*3 2∗2∗3、 2 ∗ 3 ∗ 2 2*3*2 2∗3∗2、 3 ∗ 2 ∗ 2 3*2*2 3∗2∗2 出现三次。可以做个规定,质因子一旦存在 3 3 3,那么之后只能 × 3 \times 3 ×3 或 × 5 \times 5 ×5;质因子一旦存在 5 5 5,那么之后只能 × 5 \times 5 ×5。这样 12 12 12 就只会以 2 ∗ 2 ∗ 3 2*2*3 2∗2∗3 的顺序出现一次。

    之后的想法是:维护 3 3 3 个递增队列,三个队首元素中最小的就是下一个丑数。每 pop \text{pop} pop 一个丑数后,在其他队列中 push \text{push} push 候选数字。( push \text{push} push 时注意之前的规定)

    时空复杂度均为 O ( n ) O(n) O(n).

    class Solution {
    public:
        int GetUglyNumber_Solution(int index) {
            if(index<=1) return index;
            queue<int> q2,q3,q5;
            q2.push(2);
            q3.push(3);
            q5.push(5);
            for(int i=1;i<index-1;i++){
                int mn=min({q2.front(),q3.front(),q5.front()});
                if(mn==q2.front()) q2.push(mn*2),q3.push(mn*3),q5.push(mn*5),q2.pop();
                if(mn==q3.front()) q3.push(mn*3),q5.push(mn*5),q3.pop();
                if(mn==q5.front()) q5.push(mn*5),q5.pop();
            }
            return min({q2.front(),q3.front(),q5.front()});
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    注意: 在牛客网提交时,特判第 0 0 0 个丑数为 0 0 0。

    思路二

    看了别人的做法,具体参考:牛客题解、力扣题解 。

    大概意思是,每个丑数 × 2 \times2 ×2、 × 3 \times3 ×3、 × 5 \times5 ×5 后,都会产生更大的丑数。然后维护这三个并行、互不影响的维度,每次取最小的一个,并且更新它。

    class Solution {
    public:
        int GetUglyNumber_Solution(int index) {
            vector<int> vec(index+10,0);
            int i2=1,i3=1,i5=1;
            vec[1]=1;
            for(int i=2;i<=index;i++){
                vec[i]=min({vec[i2]*2,vec[i3]*3,vec[i5]*5});
                if(vec[i]==vec[i2]*2) i2++;
                if(vec[i]==vec[i3]*3) i3++;
                if(vec[i]==vec[i5]*5) i5++;
            }
            return vec[index];
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    可以关注一些小细节它是如何解决的,比如我前面提到的那种情况: 2 ∗ 3 2*3 2∗3 和 3 ∗ 2 3*2 3∗2。在上面的代码中,会同时触发这两行:

    	if(vec[i]==vec[i2]*2) i2++;
    	if(vec[i]==vec[i3]*3) i3++;
    
    • 1
    • 2

    但并不影响它的 O ( 1 ) O(1) O(1) 复杂度。

    其他

    今天看别人代码,发现一个新奇的东西:

    int main(){
    	//...
    	return 0 ^ 0;
    }
    
    • 1
    • 2
    • 3
    • 4

    ! 0 !

  • 相关阅读:
    Flink 源码解读系列 DataStream 带 Watermark 生成的时间戳分配器
    sprintf 格式代码使用不规范在不同平台下的表现
    CN_@数据链路层的子层@局域网@以太网@Ethernet v2@802.3@802.1Q@802.11@MAC帧
    携职教育:中级经济师备考超强攻略,亲测有效,拿走不谢
    【typeof instanceof Object.prototype.toString constructor区别】
    WebDAV之葫芦儿·派盘+书藏家
    cookie,session,Token 这些你都知道吗?
    iwemeta元宇宙:宇宙网红,马斯克年度“吹牛大会”!10年卖1亿辆车,“擎天柱”机器人年底量产
    MODIS数据产品预处理方法
    cms系统稳定性压力测试出现TPS抖动和毛刺的性能bug【杭州多测师_王sir】
  • 原文地址:https://blog.csdn.net/m0_51864047/article/details/126695889
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号