剑指 Offer 49. 丑数 && Leetcode 264. 丑数 II
地址 https://leetcode-cn.com/problems/chou-shu-lcof/
我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。 示例: 输入: n = 10 输出: 12 解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。 说明: 1 是丑数。 n 不超过1690。
解答1
暴力遍历每个数 查看是不是丑数 显然是不行的
那么从1开始 每个丑数继续乘以2 乘以3 乘以5 就还是丑数,这样生成的丑数集合是没有遗漏的,排序后可以找到符合题目要求的丑数
不过2*3 和3*2 ,2*5 和5*2 会造成重复计算,时间上会超时。
我们考虑使用哈希避免重复计算。
使用最小堆保证每次放入答案集合中的是当前计算的最小丑数,这样使得答案是有序的,避免了排序。
两个小技巧就节省了不少时间,刚刚能够AC
class Solution { public: unordered_set<int> ss; priority_queue<int, vector<int>, greater<int>> minHeap; vector<int> ans; int nthUglyNumber(int n) { minHeap.push(1); while(ss.size() < n&& !minHeap.empty()){ int curr = minHeap.top();minHeap.pop(); if(ss.count(curr) ==0){ ss.insert(curr); ans.push_back(curr); if((long long) curr*2 < INT_MAX) minHeap.push(curr*2); if((long long) curr*3 < INT_MAX) minHeap.push(curr*3); if((long long) curr*5 < INT_MAX) minHeap.push(curr*5); } } return ans[n-1]; } };
解答2
我们已经明确了 一个非1的丑数 如果能够除以2 3 或者5 就能得到一个比它小的丑数,比如 6可以除以3 得到2,6除以2得到3. 30可以得到 2 3 5 6 15 10等丑数
所有的丑数 都可以从比他大的某个丑数通过这种方式计算得到,也就达到了不重不漏中的不漏。
我们剩下的问题就是避免不重复而有序的生成这些丑数
这里设置三个队列 专门有序存放当前答案集合中存放的丑数的2 3 5的倍数
每次从三个队列中取出最小的数放入答案集合,并且将这个数乘以2 3 5放入相应的队列
那么答案集合中的丑数是有序的,三个队列中的丑数也是有序的
如图
-----------------------------------------------------------------------
class Solution { public: queue<long long> a; queue<long long> b; queue<long long> c; vector<int> ans; int nthUglyNumber(int n) { ans.push_back(1); a.push(2); b.push(3); c.push(5); while (ans.size() < n) { int curr = min(a.front(), min(b.front(), c.front())); ans.push_back(curr); if (curr == a.front()) a.pop(); if (curr == b.front()) b.pop(); if (curr == c.front()) c.pop(); a.push((long long )curr * 2); b.push((long long )curr * 3); c.push((long long )curr * 5); } return ans[n - 1]; } };
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力


【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
2017-02-13 算法导论 红黑树 学习 旋转(二)图文
2017-02-13 算法导论 红黑树 热身 二叉树学习(一)图文