剑指offer33:求按从小到大的顺序的第N个丑数。
2024-10-10 14:53:53
1 题目描述
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
2 思路和方法
数值:1 2(1*2) 3(1*3) 4(2*2) 5 (1*5) 6(3*2) 8(4*2) 9(3*3) 10(5*2),……,可见1以后的丑数都是前面的丑数乘以2、3或者5。
因为丑数只包含质因子2,3,5,假设我们已经有n-1个丑数,按照顺序排列,且第n-1的丑数为M。那么第n个丑数一定是由这n-1个丑数分别乘以2,3,5,得到的所有大于M的结果中,最小的那个数。
newNum = min(arr[p2] * 2, min(arr[p3] * 3, arr[p5] * 5)); if(arr[p2] * 2 == newNum) p2++;
存在某个最小值T2(<M),而arr[p2] * 2=T2,同理,也存在这样的数T3,T5,我们只需要标记这三个数即可。
3 C++核心代码
class Solution {
public:
int GetUglyNumber_Solution(int index) {
// 0-6的丑数分别为0-6
if(index < ) return index;
//p2,p3,p5分别为三个队列的指针,newNum为从队列头选出来的最小数
int p2 = , p3 = , p5 = , newNum = ;
vector<int> arr;
arr.push_back(newNum);
while(arr.size() < index) {
//选出三个队列头最小的数
newNum = min(arr[p2] * , min(arr[p3] * , arr[p5] * ));
//这三个if有可能进入一个或者多个,进入多个是三个队列头最小的数有多个的情况
if(arr[p2] * == newNum) p2++;
if(arr[p3] * == newNum) p3++;
if(arr[p5] * == newNum) p5++;
arr.push_back(newNum);
}
return newNum;
}
};
参考资料
https://blog.csdn.net/Fly_as_tadpole/article/details/82705774
最新文章
- Android自定义Dialog(美化界面)
- php 代码优化提高MySQl的运行效率
- SNF开发平台WinForm之十-Excel导入-SNF快速开发平台3.3-Spring.Net.Framework
- C#面向对象面试题集锦
- Django开发博客- 部署
- HTTP协议中TCP的三次握手,四次挥手总结
- 【转】VS2012发布网站详细步骤
- WordPress Xhanch - My Twitter插件跨站请求伪造漏洞(CVE-2013-3253)
- iOS最好用的弹出框
- NodeJs之http
- jdk源码阅读笔记-HashMap
- Fetch API &; Async Await
- gradle 打包springboot项目,找不到项目jar application.class
- ORACLE 快速刷新物化视图的方法(11g)
- GDC2017 把“现实的天空”在游戏内再现【Forza Horizon 3】的天空表现
- INT_MAX和INT_MIN注意事项
- Linux 命令find、grep
- c# 解析json 字符串 报异常 Bad JSON escape sequence 解决方案
- redhat5本地源NBD驱动安装
- ansible基本模块-command
热门文章
- Java-Maven(九):Maven 项目pom文件引入工程根目录下lib文件夹下的jar包
- css3的选择器有哪几种?
- https://suchprogramming.com/epoll-in-3-easy-steps/
- Java对象为啥要实现Serializable接口
- XSS平台-学习
- PHP7 MongoDB 使用方法
- 禁止select标签选择,禁止select组件change值
- Flutter Offstage、Visibility隐藏/可见
- 编写第一个dart程序hello dart
- 泡泡一分钟:LandmarkBoost: Efficient Visual Context Classifiers for Robust Localization