丑数:因子中只包含235的数,习惯上将1作为第一个丑数

求从小到大排序的第1500个数字

思路1:从小到大,依次判断每个数是不是丑数

上面思路简单,但需要对第1500个丑数前所有的数字进行判定

一种降低时间复杂度的方法是只寻找丑数

设三种运算分别是×2,×3,×5,那么这三种运算对于丑数集合来说是‘闭包’运算,如果不明白闭包,可以稍微看一下这里

不难想象,所有的丑数都可以通过这三种运算求得,而且这三种运算是闭包操作,所以对于一个丑数通过这三种运算生成的数也一定都是丑数,这样就可以避免了上面提到的冗余计算

由于我们要计算从小到大排序的第n个数字,还需要搞定下面这个问题:给定前k个丑数(U1,U2,U3,…,Uk),计算第k+1个丑数Uk+1

第k+1个丑数肯定是前面k个丑数中的某个数乘以2,3,5的一个结果,在前k个丑数中,分别找到最小的丑数p2,p3,p5,使得p2*2>kp3*3>kp5*5>k,之后Uk+1=min(p2*2, p3*3, p5*5)

这样初始状态k=1,即只有1这一个丑数,p2=p3=p5=1,显然U2=min(p2*2, p3*3, p5*5)=min(2,3,5)=2,将p2指向下一个丑数,这里就是刚求得的2,之后就不断按照上面方法求解下一个丑数,直到第N个

TODO code

TOP