剑指offer33:求按从小到大的顺序的第N个丑数。
2019-08-29 08:54:36来源:博客园 阅读 ()
剑指offer33:求按从小到大的顺序的第N个丑数。
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++核心代码
1 class Solution { 2 public: 3 int GetUglyNumber_Solution(int index) { 4 // 0-6的丑数分别为0-6 5 if(index < 7) return index; 6 //p2,p3,p5分别为三个队列的指针,newNum为从队列头选出来的最小数 7 int p2 = 0, p3 = 0, p5 = 0, newNum = 1; 8 vector<int> arr; 9 arr.push_back(newNum); 10 while(arr.size() < index) { 11 //选出三个队列头最小的数 12 newNum = min(arr[p2] * 2, min(arr[p3] * 3, arr[p5] * 5)); 13 //这三个if有可能进入一个或者多个,进入多个是三个队列头最小的数有多个的情况 14 if(arr[p2] * 2 == newNum) p2++; 15 if(arr[p3] * 3 == newNum) p3++; 16 if(arr[p5] * 5 == newNum) p5++; 17 arr.push_back(newNum); 18 } 19 return newNum; 20 } 21 };View Code
参考资料
https://blog.csdn.net/Fly_as_tadpole/article/details/82705774
原文链接:https://www.cnblogs.com/wxwhnu/p/11420832.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:智能指针
- 剑指offer笔记面试题1----赋值运算符函数 2019-10-18
- 剑指offer65:矩阵中的路径(二维数组,二分查找) 2019-09-02
- 剑指offer62:二叉搜索树的第k个结点,二叉搜索树【左边的元 2019-08-31
- 剑指offer59:按之字形顺序打印二叉树:[[1], [3,2], [4,5,6 2019-08-31
- 剑指offer64:滑动窗口的最大值 2019-08-31
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash