import java.util.ArrayList;
public class Solution {
public int GetUglyNumber_Solution(int index) {
/*超时了。。
int ugly=0;
int count=1;//1是第一个丑数
int n=2;
while(count
if(ifUgly(n)){
count++;
}
n++;
}
return n;
}
public boolean ifUgly(int num){
while(num%2==0)
num/=2;
while(num%3==0)
num/=3;
while(num%5==0)
num/=5;
if(num==1){
return true;
}else {
return false;
}
}*/
if(index<=0)
return 0;
ArrayList list=new ArrayList();
list.add(1);
int m2=0;
int m3=0;
int m5=0;
while(list.size()
int i2=list.get(m2)*2;
int i3=list.get(m3)*3;
int i5=list.get(m5)*5;
int min=Math.min(i2,Math.min(i3,i5));
list.add(min);
if(min==i2){
m2++;
}
if(min==i3){
m3++;
}
if(min==i5){
m5++;
}
}
return list.get(list.size()-1);
}
}
第一种感觉也能运行出结果,但是因为每一个数都进行了运算,所以系统检测显示算法超时了,也就是同样的测试用例时间超过了1s,感觉有点奇怪。。没这么夸张吧。。
第二种的话是建立在丑数的定义上的,一个丑数肯定是另一个丑数乘2,3,5的结果,因此,我们可以建立一个数组保存已找见的丑数,然后关键就是如何保证数组内是排序的,这里比较每次乘法m2,m3,m5的大小即可,这么运算下的数组内部肯定是排好序的,这样到最后直接输出即可。
保存已找到的丑数,用空间换时间。这种算法耗时32ms。