首页 > 其他分享 >264 ugly number II 丑数

264 ugly number II 丑数

时间:2024-05-15 20:01:19浏览次数:20  
标签:丑数 factors int number II ugly dp

问题描述

An ugly number is a positive integer whose prime factors are limited to 2, 3, and 5.

Given an integer n, return the nth *ugly number*.

解释:

一个丑数是一个正整数,其公因子只有2,3,5。给定数字n,求第n个丑数

案例:

Input: n = 10
Output: 12
Explanation: [1, 2, 3, 4, 5, 6, 8, 9, 10, 12] is the sequence of the first 10 ugly numbers. 
解析:第一个丑数是1,第二个丑数是2,以此类推
Input: n = 1
Output: 1
Explanation: 1 has no prime factors, therefore all of its prime factors are limited to 2, 3, and 5.
解释: 第一个丑数是1

基本思想

这个跟换零钱一样类似,几个数字的组合。构造数组dp, 第n个丑数一定是n之前的丑数 × 2 ,× 3, × 5得到的。所以维持i,j,k三个指针, 使得 dp[n]一定是在 dp[i] * 2, dp[j] * 3, dp[k] * 5 这三个数中取最小的。即 dp[n]取决于dp[i],dp[j],dp[k]。

综上:

  • dp[n] = min(dp[i] * 2, dp[j] * 3, dp[k] * 5)
  • 其中dp[i]的更新规则如下:如果dp[i]*2 <= dp[n],则 i++

时间复杂度\(O(n^2)\)

代码

C++

    int nthUglyNumber(int n) {
        if (n<=1) return 1;
        int i,j,k;
        i=0;
        j=0;
        k=0;
        vector<int> dp(n,0);
        dp[0] = 1;
        for(int t=1;t<n;++t) {
            dp[t] = min(min(dp[i]*2,dp[j]*3), dp[k]*5);
            if (dp[i]*2 <= dp[t]) ++i;
            if (dp[j]*3<= dp[t]) ++j;
            if (dp[k]*5<=dp[t]) ++k; 
        }
        return dp[n-1];
    }

python

   def nthUglyNumber(self, n: int) -> int:
       if n<=0: return 0
       i=j=k = 0
       dp = [0] * n
       dp[0] = 1
       for e in range(1,n):
           dp[e] = min(min(dp[i]*2, dp[j]*3), dp[k]*5);
           if dp[i]*2 <= dp[e]: i = i + 1  # i++ 和 i = i+1 是不一样的
           if dp[j]*3 <= dp[e]: j = j + 1
           if dp[k]*5 <= dp[e]: k = k + 1
       return dp[n-1]

标签:丑数,factors,int,number,II,ugly,dp
From: https://www.cnblogs.com/douniwanli/p/18194588

相关文章

  • 文章详情URL不使用ID用slug和uuiid代替
    在Laravel中,可以通过使用slug或UUID来展示文章详情和文章列表。这样可以提高URL的可读性和安全性。以下是实现方法和代码示例:方法一:使用Slug数据库字段首先,在posts表中添加slug字段:Schema::table('posts',function(Blueprint$table){$table->string('sl......
  • 本地SSL证书过期 输入命令在IIS自动生成
    C:\Users\win10-zhiyong>dotnetdev-certshttps--trustTrustingtheHTTPSdevelopmentcertificatewasrequested.Aconfirmationpromptwillbedisplayedifthecertificatewasnotpreviouslytrusted.Clickyesontheprompttotrustthecertificate.Suc......
  • 代码随想录算法训练营第第七天 | 454.四数相加II 、383. 赎金信 、15. 三数之和 、18
    454.四数相加II建议:本题是使用map巧妙解决的问题,好好体会一下哈希法如何提高程序执行效率,降低时间复杂度,当然使用哈希法会提高空间复杂度,但一般来说我们都是舍空间换时间,工业开发也是这样。题目链接/文章讲解/视频讲解:https://programmercarl.com/0454.四数相加II.html......
  • 代码随想录算法训练营第七天 | 454.四数相加II 383.赎金信 15.三数和
    四数相加II题目链接文章讲解视频讲解时间复杂度o(n2)空间复杂度o(n)classSolution{public:intfourSumCount(vector<int>&nums1,vector<int>&nums2,vector<int>&nums3,vector<int>&nums4){unordered_map<int,int>tw......
  • Cubemx IIC驱动oled 显示汉字、字母
    OLED实物图: 创建工程1.配置外部晶振 2.配置时钟 3.使能IIC 4.生成代码移植驱动代码移植oled.h#ifndef__OLED_H#define__OLED_H#include"i2c.h"/*OLED控制用函数*/voidOLED_Set_Pos(uint8_tx,uint8_ty);voidOLED_Display_On(void);voidO......
  • 学习笔记:生成函数II(集合分拆、置换、整数分拆、它们的递推公式、生成函数 和快速计算)
    形式幂级数的更多运算形式幂级数与幂级数的比较形式幂级数本质是序列(\(x^i\)无意义),幂级数本质是极限。形式幂级数通过带入\(x\)还原成幂级数。假设系数在\(\mathbb{C}\)上,可以证明形式幂级数与具有正收敛半径的幂级数在'通常'的所有运算上服从同样规律(加减乘除求导积......
  • [转帖]IIS 403错误详细原因
    https://www.cnblogs.com/wang_yb/archive/2010/05/10/1732093.html 在使用IIS的时候,如果遇到403相关的错误,往往束手无策,不知道是什么权限的原因。现总结如下,供以后参考。 403.1-执行访问被禁止下面是导致此错误信息的两个常见原因:1、您没有足够的执行许可例如,如......
  • UcOs-III 源码阅读: os_time.c
    对实时时钟源文件os_time.c进行源码阅读与注释://功能:Tick级别延时、时间延时、恢复延时中的任务、获取/设置系统Tick值、实时时钟滴答函数//Tick级别延时API:OSTimeDly(ticks)//时间延时API:OSTimeDlyHMSM(p_hmsm)//恢复延时API:OSTimeDlyResume(task_id)//获取系统T......
  • 45_jump Game II 跳跃游戏II
    45_jumpGameII跳跃游戏II问题描述链接:https://leetcode.com/problems/jump-game-ii/description/Youaregivena0-indexedarrayofintegersnumsoflengthn.Youareinitiallypositionedatnums[0].Eachelementnums[i]representsthemaximumlengthofafo......
  • 代码随想录算法训练营第四天 | 23.两l两交换链表中的节点 19.删除链表的倒数第N个节点
    23.两两交换链表中的两个节点题目链接文章讲解视频讲解时间复杂度o(n)空间复杂度o(1)tips:画图,并将每一步操作用伪代码写出来,然后将代码理顺可以避免修改代码的麻烦初始化的时候就要将previous初始化为current的前一个节点,这样可以保证循环的第一步满足循环要求cla......