描述
设计一个算法,找出只含素因子2
,3
,5
的第 n 小的数。
符合条件的数如:1, 2, 3, 4, 5, 6, 8, 9, 10, 12...
我们可以认为1
也是一个丑数
解法:只含素因子2或3或5的数可以表示成。
假设我们得到了上一个丑数,通过*2,*3或者*5可以得到新的丑数。
问题是:去重 剔除像2*2*3=2*3*2这种情况;
算法:
1.最初的丑数为1。
2.我们使用3个游标p1=p2=p3=1,他们所指向的位置,分别*2,*3,*5得到下一个丑数。
3.我们要从小到大生成丑数,因此我们当前生成的丑数为Arr[p1]*2,Arr[p2]*3,Arr[p3]*5中的最小值。
4.当我们得到最小值之后,我们需要判断这个丑数是哪个游标导致的,将这个游标的索引++。
5.生成的第n个丑数即为所要求的值。
AC代码:
class Solution {
public:
/**
* @param n: An integer
* @return: the nth prime number as description.
*/
int nthUglyNumber(int n) {
// write your code here
int Arr[n+1],p2,p3,p5;
p2=p3=p5=1;
Arr[1]=1;
for(int i=2;i<=n;i++){
Arr[i]=min(min(Arr[p2]*2,Arr[p3]*3),Arr[p5]*5);
if(Arr[i]==Arr[p2]*2){
p2++;
}
if(Arr[i]==Arr[p3]*3){
p3++;
}
if(Arr[i]==Arr[p5]*5){
p5++;
}
}
return Arr[n];
}
};