Leetcode.264 丑数 II

题目链接

Leetcode.264 丑数 II mid

题目描述

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

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

示例1:
输入:n = 10
输出:12
解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。
示例2:
输入:n = 1
输出:1
解释:1 通常被视为丑数。
提示:
  • 1 ≤ n ≤ 1690 1 \leq n \leq 1690 1n1690

解法:动态规划

f ( n ) f(n) f(n) 代表第 n n n丑数

因为每个丑数都只包含 2 , 3 , 5 2, 3, 5 2,3,5 的质因子(除开 1 1 1),那么 f ( n ) f(n) f(n) 也就是第 n n n丑数,必然是由 [ 1 , n − 1 ] [1, n - 1] [1,n1] 之间的某一个丑数,假设是 f ( i ) × 2 , f ( i ) × 3 , f ( i ) × 5 f(i) \times 2,f(i) \times 3, f(i) \times 5 f(i)×2,f(i)×3,f(i)×5,三个其中的一个而来。

很显然, f ( n ) f(n) f(n) 的值一定是 f ( i ) × 2 , f ( i ) × 3 , f ( i ) × 5 f(i) \times 2,f(i) \times 3, f(i) \times 5 f(i)×2,f(i)×3,f(i)×5 三者之中的最小值

举例说明:

f(1) = 1
f(2) = f(1) * 2 = 2
f(3) = f(1) * 3 = 3
f(4) = f(2) * 2 = 4
f(5) = f(1) * 5 = 5
f(6) = f(3) * 2 = 6
f(7) = f(4) * 2 = 8
f(8) = f(3) * 3 = 9

我们用三个指针 a , b , c a, b, c a,b,c 分别代表 × 2 \times 2 ×2 × 3 \times 3 ×3 × 5 \times 5 ×5 代表的丑数。那么当前的丑数 f ( i ) f(i) f(i) 就是 m i n { f ( a ) × 2 , f ( b ) × 3 , f ( c ) × 5 } min\{ f(a) \times 2, f(b) \times 3, f(c) \times 5\} min{f(a)×2,f(b)×3,f(c)×5}


r 2 = f ( a ) × 2 r 3 = f ( b ) × 3 r 5 = f ( c ) × 5 r_2 = f(a) \times 2 \\ r_3 = f(b) \times 3 \\ r_5 = f(c) \times 5 r2=f(a)×2r3=f(b)×3r5=f(c)×5

如果 f ( i ) = r 2 f(i) = r_2 f(i)=r2,那么指针 a a a 就往后移动一位。

其原理是,如果 r 2 = f ( a ) × 2 r_2 = f(a) \times 2 r2=f(a)×2 就是当前的第 i i i 个丑数,那么我们记录答案, f ( i ) = r 2 f(i) = r_2 f(i)=r2。既然 f ( a ) × 2 f(a) \times2 f(a)×2 这个丑数已经在当前的答案集合 f f f 中了,那么比当前丑数 f ( a ) × 2 f(a) \times2 f(a)×2 更小的丑数也肯定在答案集合 f f f 中,所以后面只需要考虑比 f ( a ) × 2 f(a) \times 2 f(a)×2 更大的丑数,也就是 f ( a + 1 ) × 2 f(a+1) \times 2 f(a+1)×2,所以指针 a a a 才要往后移动一位。

对于 f ( i ) = r 3 f(i)=r_3 f(i)=r3 f ( i ) = r 5 f(i) = r_5 f(i)=r5 的情况同理。

a , b , c a, b,c a,b,c 都初始化为 1 1 1 f ( 1 ) = 1 f(1) = 1 f(1)=1

{ r 2 = f ( a ) × 2 r 3 = f ( b ) × 3 r 5 = f ( c ) × 5 f ( i ) = m i n { r 2 , r 3 , r 5 } ,   i ∈ [ 2 , n ] i f   r 2 = f ( i )   t h e n   a + 1 i f   r 3 = f ( i )   t h e n   b + 1 i f   r 5 = f ( i )   t h e n   c + 1 \left\{\begin{array}{l} r_2 = f(a) \times 2 \\ r_3 = f(b) \times 3 \\ r_5 = f(c) \times 5 \\ f(i) = min\{r_2, r_3,r_5\},\ i \in [2,n]\\ if\ r_2=f(i) \ then \ a + 1 \\ if\ r_3=f(i) \ then \ b + 1 \\ if\ r_5=f(i) \ then \ c + 1 \end{array}\right. r2=f(a)×2r3=f(b)×3r5=f(c)×5f(i)=min{r2,r3,r5}, i[2,n]if r2=f(i) then a+1if r3=f(i) then b+1if r5=f(i) then c+1

时间复杂度: O ( n ) O(n) O(n)

C++:

class Solution {
public:
    int nthUglyNumber(int n) {
        vector<int> f(n + 1);
        f[1] = 1;
        int a = 1, b = 1, c = 1;

        for(int i = 2; i <= n; ++i){
            int r2 = f[a] * 2, r3 = f[b] * 3, r5 = f[c] * 5;
            f[i] = min({r2, r3, r5});
            if(f[i] == r2) a++;
            if(f[i] == r3) b++;
            if(f[i] == r5) c++;
        }

        return f[n];
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/973097.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Plant Simulation培训教程-AGV配送物流仿真模块

原创 知行 天理智能科技 2024年12月31日 07:00 浙江 又到年终盘点的时候了&#xff0c;在这里我把之前录制的Plant Simulation培训教程-AGV配送物流仿真模块分享出来&#xff0c;有需要的可以直接联系我。 模型路径通过Marker点搭建&#xff0c;适用于磁条导航、二维码导航等…

【Python 专题】数据结构 树

LeetCode 题目104. 二叉树的最大深度(gif 图解)方法一:后序遍历(DFS)方法二:层序遍历(BFS)872. 叶子相似的树(DFS 遍历)1448. 统计二叉树中好节点的数目(DFS 遍历)437. 路径总和 III(前缀和 + DFS 回溯)1372. 二叉树中的最长交错路径(DFS)236. 二叉树的最近公共…

基于射频开关选择的VNA校准设计

活动发起人小虚竹 想对你说&#xff1a; 这是一个以写作博客为目的的创作活动&#xff0c;旨在鼓励大学生博主们挖掘自己的创作潜能&#xff0c;展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴&#xff0c;那么&#xff0c;快来参加吧&#xff01…

关于协同显著性物体检测的思考

摘要 问题一&#xff1a;什么叫做CoEG-Net框架&#xff1f; CoEG-Net 是一种用于图像分割或其他计算机视觉任务的深度学习框架&#xff0c;具体来说&#xff0c;它主要关注边缘感知和图像细节恢复。CoEG-Net 的全称是 Contextual Edge Guidance Network&#xff0c;其主要创新…

排查JVM的一些命令

查看JVM相关信息的方法 环境&#xff1a; Win10, jdk17 查看端口的Pid netstat -ano | findstr <端口号>列出当前运行的JVM进程 ## 用于输出JVM中运行的进程状态信息。通过jps&#xff0c;可以快速获取Java进程的PID&#xff08;进程标识符&#xff09;&#xff0c; …

【AI应用】Cherry Studio结合deepseek搭建本地知识库

硅基流动注册 前往 硅基官网 &#xff08;https://cloud.siliconflow.cn/i/JUwuNCzb&#xff09;链接带了我的推荐码&#xff0c;注册成功后&#xff0c;您将获得 14R&#xff08;2000W Token&#xff09;&#xff0c;用于配置 Embedding&#xff08;嵌入式模型&#xff09; 新…

第1章大型互联网公司的基础架构——1.11 消息中间件技术

消息队列&#xff08;Message Queue&#xff09;是分布式系统中最重要的中间件之一&#xff0c;在服务架构设计中被广泛使用。 1.11.1 通信模式与用途 消息中间件构建了这样的通信模式&#xff1a; 一条消息由生产者创建&#xff0c;并被投递到存放消息的队列中&#xff1b;…

windows解压多个文件夹内的zip文件脚本

情景引入 不知道大家是否有一个疑问&#xff0c;如果下载到的源码文件是很多个目录&#xff0c;目录里面的项目都是压缩的&#xff0c;那我们该怎么办&#xff1f; 目录结构 目录结构如下 Test ├── 1 │ └── 1.zip └── 2 └── 2.zip 执行脚本 先cd到Test下&am…

文件和目录的操作-8

文章目录 1.IO流2.文件流操作with语句3.文件和文件夹的操作4.案例1.IO流 通过“流”的形式允许计算机程序使用相同的方式来访问不同的输入/输出源。stream是从源(source)到接收目标的(sink)有序数据。如果把输入/输出源比作“水桶”,那流就是“管道” 文件流:就是源或者…

EasyRTC:轻量化SDK赋能嵌入式设备,开启智能硬件音视频通讯新篇章

在智能硬件与物联网飞速发展的今天&#xff0c;嵌入式设备的音视频通讯能力正变得愈发重要。然而&#xff0c;受限于硬件资源&#xff0c;尤其是Flash存储空间的不足&#xff0c;传统音视频通讯方案往往难以在嵌入式设备上实现高效集成。EasyRTC凭借其轻量级SDK和先进的技术架构…

处理哈希冲突

有时候哈希表⽆论选择什么哈希函数都⽆法避免冲突&#xff0c;那么插⼊数据时&#xff0c;如何解决冲突呢&#xff1f;主要两种⽅法&#xff0c;线性探测法和链地址法&#xff0c;这篇先做原理描述&#xff0c;下篇实现代码模拟 一、线性探测 发生冲突的位置开始&#xff0c;依…

安装MySQL9.1.0-winx64.msi的报错解决办法:Database initialization failed。(也适用9.2.0)

csdn上有很多关于安装MySQL9.1.0-winx64.msi的报错&#xff08;Database initialization failed&#xff09;的解决办法&#xff0c;根据报错log便签内容总结一下有以下几种&#xff1a; 1、电脑名称有中文的&#xff0c;参考这篇&#xff1a; 【MySQL】Windows上安装MySQL时…

聊一聊vue如何实现角色权限的控制的

大家好&#xff0c;我是G探险者。 关于角色与权限控制&#xff0c;通常是分为两大类&#xff1a;一种是菜单权限&#xff1b;一种是操作权限。 菜单权限是指&#xff0c;每个角色对应着可以看到哪些菜单&#xff0c;至于每个菜单里面的每个按钮&#xff0c;比如增删改查等等这类…

使用 OpenTelemetry 和 Langtrace 的 Elastic 分发跟踪基于 RAG 的聊天机器人

作者&#xff1a;来自 Elastic Bahubali Shetti 如何使用 Elastic 观察基于 OpenAI RAG 的应用程序。使用 Langtrace 对应用程序进行检测&#xff0c;收集日志、跟踪、指标&#xff0c;并了解 LLM 在 Kubernetes 上使用 OpenTelemetry 的 Elastic Distributions 的运行情况。 目…

掌握.NET Core后端发布流程,如何部署后端应用?

无论你是刚接触.NET Core的新手还是已有经验的开发者&#xff0c;在这篇文章中你将会学习到一系列实用的发布技巧与最佳实践&#xff0c;帮助你高效顺利地将.NET Core后端应用部署到生产环境中 目录 程序发布操作 Docker容器注册表 文件夹发布 导入配置文件 网站运行操作 …

VSCode配置C/C++开发环境|最新教程202502

&#x1f4e2; ‌Windows版VSCode配置C/C开发环境&#xff08;单文件多文件全解析&#xff09;‌ 一、 ‌环境准备‌ ✅‌必需工具‌&#xff1a;Visual Studio Code 2025‌ ✅扩展插件‌&#xff1a;C/C&#xff08;Microsoft官方扩展&#xff09;&#x1f4e2; 这个必须安…

小米AX3000T 路由器如何开启 SSH 安装 OpenWRT 系统,不需要降级 v1.0.91 (2025)

小米AX3000T 路由器如何开启 SSH 安装 OpenWRT 系统&#xff0c;不需要降级 v1.0.91 &#xff08;2025&#xff09; 本文内容需要你有一定的 Linux 操作基础&#xff0c;最好是程序员那种&#xff0c;英文水平足够用才行。一般人不需要使用这么复杂的路由器操作系统&#xff0c…

2025最新智能优化算法:改进型雪雁算法(Improved Snow Geese Algorithm, ISGA)求解23个经典函数测试集,MATLAB

一、改进型雪雁算法 雪雁算法&#xff08;Snow Geese Algorithm&#xff0c;SGA&#xff09;是2024年提出的一种新型元启发式算法&#xff0c;其灵感来源于雪雁的迁徙行为&#xff0c;特别是它们在迁徙过程中形成的独特“人字形”和“直线”飞行模式。该算法通过模拟雪雁的飞行…

【从0做项目】Java文档搜索引擎(9)烧脑终章!

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 文章导读 阿华将发布项目复盘系列的文章&#xff0c;旨在&#xff1a; 1&#xff1a;手把手细致带大家从0到…

cs106x-lecture12(Autumn 2017)-SPL实现

打卡cs106x(Autumn 2017)-lecture12 (以下皆使用SPL实现&#xff0c;非STL库&#xff0c;后续课程结束会使用STL实现) travel Write a recursive function named travel that accepts integers x and y as parameters and uses recursive backtracking to print all solution…