把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
法一:以空间换取时间,提高了效率
class Solution {
public:
int GetUglyNumber_Solution(int index) {
if (index<=0)
return 0;
int *p=new int[index];
p[0]=1;
int next=1;
int *p2=p;
int *p3=p;
int *p5=p;
while(next<index)
{
int min=min3(*p2*2,*p3*3,*p5*5);
p[next]=min;
while(*p2*2<=p[next])
++p2;
while(*p3*3<=p[next])
++p3;
while(*p5*5<=p[next])
++p5;
++next;
}
int ugly=p[next-1];
delete []p;
return ugly;
}
int min3(int a,int b,int c)
{
int min=0;
min=(a<b?a:b);
min=(min<c?min:c);
return min;
}
};
法二:对于每个数都要进行是否是丑数的判断,浪费时间,运行时间长
class Solution {
public:
int GetUglyNumber_Solution(int index) {
int number=0;
int count=0;
while(count<index)
{
++number;
if (isugly(number))
++count;
}
return number;
}
bool isugly(int n)
{
while(n%2==0)
n/=2;
while(n%3==0)
n/=3;
while(n%5==0)
n/=5;
return (n==1)?true:false;
}
};