264. 丑数 II-动态规划-(263. 丑数)

Posted hequnwang10

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了264. 丑数 II-动态规划-(263. 丑数)相关的知识,希望对你有一定的参考价值。

一、题目描述

给你一个整数 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 通常被视为丑数。

二、解题

动态规划

dp[i] 表示第 i 个丑数,第 n 个丑数即为dp[n]。
最小的丑数是 1,因此 dp[1]=1;
定义三个指针 p2,p3,p5,表示下一个丑数是当前指针指向的丑数乘以对应的质因数。初始时,三个指针的值都是 1。

  • dp[i] = min(dp[p2]*2,dp[p3]*3,dp[p5]*5)
  • 其次比较dp[i] 和 dp[p2]*2、dp[p3]*3、 dp[p5]*5是否相等,相等则将对应的指针+1;
class Solution 
    public int nthUglyNumber(int n) 
        int[] dp = new int[n + 1];
        dp[1] = 1;
        int p2 = 1, p3 = 1, p5 = 1;
        for (int i = 2; i <= n; i++) 
            int num2 = dp[p2] * 2, num3 = dp[p3] * 3, num5 = dp[p5] * 5;
            dp[i] = Math.min(Math.min(num2, num3), num5);
            if (dp[i] == num2) 
                p2++;
            
            if (dp[i] == num3) 
                p3++;
            
            if (dp[i] == num5) 
                p5++;
            
        
        return dp[n];
    

时间复杂度:O(n);

空间复杂度:O(n)。

263. 丑数

一、题目描述

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

给你一个整数 n ,请你判断 n 是否为 丑数 。如果是,返回 true ;否则,返回 false 。

示例 1:
输入:n = 6
输出:true
解释:6 = 2 × 3
示例 2:
输入:n = 1
输出:true
解释:1 没有质因数,因此它的全部质因数是 2, 3, 5 的空集。习惯上将其视作第一个丑数。
示例 3:
输入:n = 14
输出:false
解释:14 不是丑数,因为它包含了另外一个质因数 7 。

二、解题

数学

class Solution 
    public boolean isUgly(int n) 
        if(n <= 0)
            return false;
        
        
        int[] factors = new int[]2,3,5;
        for(int factor : factors)
            while(n % factor == 0)
                n /= factor;
            
        
        return n==1;
    

时间复杂度:O(logn);

空间复杂度:O(1)。

以上是关于264. 丑数 II-动态规划-(263. 丑数)的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer 264. 丑数 II(动态规划,Java)

剑指Offer 264. 丑数 II(动态规划,Java)

Leetcode 264.丑数II

264. 丑数 II(优先队列三指针)

264. 丑数 II(优先队列三指针)

264. 丑数 II