当前位置: 移动技术网 > IT编程>开发语言>C/C++ > 剑指offer33:求按从小到大的顺序的第N个丑数。

剑指offer33:求按从小到大的顺序的第N个丑数。

2019年08月28日  | 移动技术网IT编程  | 我要评论

经典小说网,交通银行网上银行登陆,www.550.so

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,同理,也存在这样的数t3t5,我们只需要标记这三个数即可。

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 };

参考资料

https://blog.csdn.net/fly_as_tadpole/article/details/82705774

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网