• Leetcode每日一题 264. 丑数 II


    264. 丑数 II

    给你一个整数 n ,请你找出并返回第 n 个 丑数 。

    丑数 就是只包含质因数 2、3 和/或 5 的正整数。

    示例 1:

    输入:n = 10
    输出:12
    解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。
    

    示例 2:

    输入:n = 1
    输出:1
    解释:1 通常被视为丑数。
    

    提示:

    • 1 <= n <= 1690

    很明显,判断每一个数是否是丑数,再判断它是第几个明显不现实,绝对超时,所以要提前构造每个数的2,3,5倍,然后直到这是第n个丑数,再返回。

    构造方法就是建立一个dp数组,dp[i-1]代表的这是第i个丑数,初始化dp[0] = 1,因为第一个丑数是1,然后我们使用3个下标p2=0,p3=0,p5=0,去分别代表2倍,3倍,5倍,如何构造第二个丑数呢,我们要使2dp[p2],3dp[p3],5dp[p5],很明显,其中最小的就是第2个丑数,3dp[p3],5[p5]一定是后面的丑数了(只对这次而言),然后p2下标加一,第三个丑数理所当然的应该是3dp[p3],算嘛,2dp[p2],3dp[p3],5dp[p5],中最小的一定是3dp[p3],而我们不用算,我们只需要用min来取得每次一最小的丑数就行了。

    class Solution {
    public:
        int nthUglyNumber(int n) {
            int p2 = 0 , p3 = 0 , p5 = 0;
    
            vector<int> dp(n,1);
    
            dp[0] = 1;
            for(int i = 1 ; i < n ; i++)
            {
                dp[i] = min(min(dp[p2]*2,dp[p3]*3),dp[p5]*5);
                if(dp[p2]*2 == dp[i])p2++; //以下三行都是防止大小相等的元素构成两个相同丑数
                if(dp[p3]*3 == dp[i])p3++;
                if(dp[p5]*5 == dp[i])p5++;
            }
    
            return dp[n-1];
        }
    
    };
    
  • 相关阅读:
    Verilog模块概念和实例化#转载自Jason from Lofter
    P4-verilog实现mips单周期CPU
    P0-Logisim简单部件与有限状态机
    终——提问回顾与个人总结
    技术博客——PyPDF2 & Reportlab 使用
    结对——软工第一次结对项目
    分析——个人第二次博客作业
    交点——软工第一次个人项目作业
    启——软工第一次个人博客作业
    再会,旧时光——软工热身作业
  • 原文地址:https://www.cnblogs.com/xiangqi/p/14650910.html
Copyright © 2020-2023  润新知