【一刷《剑指Offer》】面试题 34:丑数

力扣对应题目链接:264. 丑数 II - 力扣(LeetCode)

牛客对应题目链接:丑数_牛客题霸_牛客网 (nowcoder.com)


一、《剑指Offer》对应内容


二、分析题目

根据题意,每个丑数都可以由其他较小的丑数通过乘以 2 或 3 或 5 得到。所以,我们可以考虑使用一个优先队列保存所有的丑数,每次取出最小的那个,然后乘以 2 , 3 , 5 后放回队列。然而,这样做会出现重复的丑数。例如:

初始化丑数列表 [1]
第一轮: 1 -> 2, 3, 5 ,丑数列表变为 [1, 2, 3, 5]
第二轮: 2 -> 4, 6, 10 ,丑数列表变为 [1, 2, 3, 4, 6, 10]
第三轮: 3 -> 6, 9, 15 ,出现重复的丑数 6

为了避免重复,我们可以用三个指针 p2、p3、p5 来分别表示下一个丑数是当前指针指向的丑数乘以 2、3、5。

利用三个指针生成丑数的算法流程:

  • 初始化丑数列表 dp,首个丑数为 1 ,三个指针 p2、p3、p5 都指向首个丑数。
  • 开启循环生成丑数:
  1. 计算下一个丑数的候选集 dp[p2]*2、dp[p3]*3、dp[p5]*5 。
  2. 选择丑数候选集中最小的那个作为下一个丑数,填入 dp。
  3. 将被选中的丑数对应的指针向右移动一格。
  • 返回 dp 的最后一个元素即可。

三、代码

//力扣
class Solution {
public:
    int nthUglyNumber(int n) {
        vector<int> dp(n+1);
        dp[1]=1;
        int p2=1, p3=1, p5=1;
        for(int i=2; i<=n; i++)
        {
            int num2=dp[p2]*2;
            int num3=dp[p3]*3;
            int num5=dp[p5]*5;
            dp[i]=min(num2, min(num3, num5));
            if(dp[i]==num2) p2++;
            if(dp[i]==num3) p3++;
            if(dp[i]==num5) p5++;
        }
        return dp[n];
    }
};

//牛客
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param index int整型 
     * @return int整型
     */
    int GetUglyNumber_Solution(int index) {
        if(index==0) return 0;
        vector<int> dp(index+1);
        dp[1]=1;
        int a=1, b=1, c=1;
        for(int i=2; i<=index; i++)
        {
            int x=dp[a]*2;
            int y=dp[b]*3;
            int z=dp[c]*5;
            dp[i]=min(x, min(y, z));
            if(dp[i]==x) a++;
            if(dp[i]==y) b++;
            if(dp[i]==z) c++;
        }
        return dp[index];
    }
};

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-20 21:54:04       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-20 21:54:04       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-20 21:54:04       45 阅读
  4. Python语言-面向对象

    2024-07-20 21:54:04       55 阅读

热门阅读

  1. 23年oppo提前批B组笔试真题-小欧的卡牌

    2024-07-20 21:54:04       18 阅读
  2. Django已经登录但是还是提示登录

    2024-07-20 21:54:04       17 阅读
  3. Go语言入门之函数

    2024-07-20 21:54:04       18 阅读
  4. swift小知识点

    2024-07-20 21:54:04       14 阅读
  5. 项目中MyBatis要引入的内容

    2024-07-20 21:54:04       16 阅读
  6. ccf-csp认证--仓库规划

    2024-07-20 21:54:04       17 阅读
  7. Kraken代码阅读(一)

    2024-07-20 21:54:04       15 阅读
  8. Oracle数据库 v$access

    2024-07-20 21:54:04       14 阅读
  9. ZooKeeper 部署

    2024-07-20 21:54:04       17 阅读
  10. 【Webpack】提高打包速度

    2024-07-20 21:54:04       15 阅读