题目描述
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
思路一:
暴力的方法,一个函数判断数是否为丑数,另外一个函数从1开始遍历,直到找到k个丑数为止。下面是判断丑数的方法:
public boolean ifUgly(int num){
while(num!=1){
if(set.contains(num)){
return true;
}
else if(num%2==0){
num=num/2;
}else if(num%3==0){
num=num/3;
}else if(num%5==0){
num=num/5;
}else{
return false;
}
}
return true;
}
很可惜,运行超时。
思路二:
使用动态规划,定义一个数组用于记录之前的丑数,再去乘2,3,5倍,找出最小值,再将对应的索引自增1,直到找到第k个。需要注意的是1也是丑数。
public int GetUglyNumber_Solution(int index) {
if(index==0){
return 0;
}
int a=0;
int b=0;
int c=0;
int num[] = new int[index];
int cnt=0;
num[0]=1;
while(cnt<index-1){
int min = Math.min(2*num[a],Math.min(3*num[b],5*num[c]));
if(min==2*num[a]) a++;
if(min==3*num[b]) b++;
if(min==5*num[c]) c++;
num[++cnt] = min;
}
return num[index-1];
}