LeetCode 264 —— 丑数 II

devtools/2024/9/23 20:59:22/

阅读目录

    • 1. 题目
    • 2. 解题思路
    • 3. 代码实现

1. 题目

2. 解题思路

第一个丑数是 1 1 1,由于丑数的质因子只包含 2 、 3 、 5 2、3、5 235,所以后面的丑数肯定是前面的丑数分别乘以 2 、 3 、 5 2、3、5 235 后得到的数字。

这样,我们维护三个队列,factors_two、factors_three、factors_five,分别代表前面的丑数乘以 2 、 3 、 5 2、3、5 235 之后得到的数字序列。然后,每一次,我们只需要从这三个队列头部取一个最小的元素作为下一个丑数即可。当三个队列有一个为空的时候,我们就取出下一个丑数,分别填充到三个队列中去。

上面的方法可以进一步优化,其实每一次比较的时候我们只用到了三个队列头部的元素,而三个队列头部的元素又分别是某一个丑数乘以 2 、 3 、 5 2、3、5 235 后得到的数字,所以,我们只需要分别记录三个队列头部元素对应的丑数即可

时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( n ) O(n) O(n)

3. 代码实现

class Solution {
public:int nthUglyNumber(int n) {vector<unsigned int> uglyNumbers = {1};uglyNumbers.reserve(n+1);queue<unsigned int> factors_two;queue<unsigned int> factors_three;queue<unsigned int> factors_five;int idx = 0;while (uglyNumbers.size() < n) {if (factors_two.empty() || factors_three.empty() || factors_five.empty()) {factors_two.push(uglyNumbers[idx] * 2);factors_three.push(uglyNumbers[idx] * 3);factors_five.push(uglyNumbers[idx++] * 5);}int min_num = min(min(factors_two.front(), factors_three.front()), factors_five.front());uglyNumbers.push_back(min_num);if (min_num == factors_two.front()) {factors_two.pop();} if (min_num == factors_three.front()) { factors_three.pop();} if (min_num == factors_five.front()) {factors_five.pop();}}return uglyNumbers[n-1];}
};

优化后的代码如下:

class Solution {
public:int nthUglyNumber(int n) {vector<unsigned int> uglyNumbers = {1};uglyNumbers.reserve(n+1);int factors_two = 0;int factors_three = 0;int factors_five = 0;while (uglyNumbers.size() < n) {unsigned int p2 = uglyNumbers[factors_two] * 2;unsigned int p3 = uglyNumbers[factors_three] * 3;unsigned int p5 = uglyNumbers[factors_five] * 5;unsigned int min_num = min(min(p2, p3), p5);uglyNumbers.push_back(min_num);if (min_num == p2) {++factors_two;} if (min_num == p3) { ++factors_three;} if (min_num == p5) {++factors_five;}}return uglyNumbers[n-1];}
};

http://www.ppmy.cn/devtools/43772.html

相关文章

day34 贪心算法 455.分发饼干 376. 摆动序列

贪心算法理论基础 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 贪心一般解题步骤&#xff08;贪心无套路&#xff09;&#xff1a; 将问题分解为若干个子问题找出适合的贪心策略求解每一个子问题的最优解将局部最优解堆叠成全局最优解 455.分发饼干 …

在flutter initState 方法,触发 setState导致循环执行

在Flutter中&#xff0c;如果你在initState中调用了一个方法&#xff0c;并且这个方法可能导致状态更新&#xff0c;这可能会引起无限循环&#xff0c;因为每次状态更新都会再次调用initState。 为了避免这种情况&#xff0c;你应该检查调用的方法是否会导致状态更新&#xff…

ElasticSearch - 删除已经设置的认证密码(7.x)

文章目录 Pre版本号 7.x操作步骤检查当前Elasticsearch安全配置停止Elasticsearch服务修改Elasticsearch配置文件删除密码重启Elasticsearch服务验证配置 小结 Pre Elasticsearch - Configuring security in Elasticsearch 开启用户名和密码访问 版本号 7.x ES7.x 操作步骤 …

深度学习中文笔记.pdf

深度学习和机器学习应该如何入门呢&#xff1f;这是很多初学者经常提的问题&#xff0c;针对这个问题&#xff0c;相信很多过来人都会推荐吴恩达的在线课程。不过&#xff0c;由于是英文版本&#xff0c;就将很多人挡在了门外。 于是&#xff0c;在国内&#xff0c;以黄海广博士…

word如何创造新的格式标题

1 效果如下&#xff1a;&#xff08;标题命名默认音序排序&#xff09; 2 创建 选中自己喜欢的标题&#xff0c;修改字号字体&#xff0c;then 3 修改 注意要点如下&#xff1a; 后续&#xff1a;以上操作可能导致后续一级标题不能折叠二级标题&#xff0c;目录导航栏也不能…

一篇文章带你快速搞定Kafka术语no.2

在Kafka的世界中有很多概念和术语是需要你提前理解并熟练掌握的&#xff0c;这对于后面你深入学习Kafka各种功能和特性将大有裨益。下面我来盘点一下Kafka的各种术语。 在专栏的第一期我说过Kafka属于分布式的消息引擎系统&#xff0c;它的主要功能是提供一套完备的消息发布与…

linux 目录 /usr/lib和 /usr/lib64区别

在 Linux 系统中&#xff0c;/usr/lib 和 /usr/lib64 目录通常用于存储库文件&#xff08;libraries&#xff09;&#xff0c;这些库文件是程序运行时所需的共享代码和数据。这两个目录之间的主要区别在于它们所包含的库文件的架构&#xff08;architecture&#xff09;和用途。…

Unity LayerMask避坑笔记

今天使用Physics2D.OverlapAreaNonAlloc进行物理检测时候&#xff0c;通过LayerMask.NameToLayer传入了int值的LayerMask&#xff0c;结果一直识别不到&#xff0c;经过Debug才找到问题&#xff0c;竟是LayerMask的“值”传输有问题&#xff0c;记录一下。 直接贴代码输出结果&…