第一种暴力算法
package question49_urgly_number;
/**
* @Classname Solution1
* @Description TODO
* @Date 2020/3/29 11:15
* @Created by mmz
*/
public class Solution1 {
public static boolean isUgrly(int number){
while(number%2 ==0){
number /=2;
}
while(number%3 == 0){
number /=3;
}
while (number%5 == 0){
number /=5;
}
return (number==1)?true:false;
}
public static int printUgrly(int index){
if(index<=0){
return 0;
}
int number = 0;
int count =0;
while(number<index){
++number;
if(isUgrly(number)){
count++;
}
}
return count;
}
}
m
前面的算法之所以效率低,很大程度是因为不管一个数是不是丑数,我们都要对它进行计算,接下来我们试着找到一种只计算丑数的方法,而不再非丑数的整数上花费时间,根据丑数的定义,丑数应该是另一个丑数乘以2,3,或者5的结果。因此我们可以创建一个数组,里面的数字正好是排序的丑数,每个丑数都是前面的丑数乘以2,3,或者5得到的。
package question49_urgly_number;
/**
* @Classname Solution2
* @Description TODO
* @Date 2020/3/29 15:57
* @Created by mmz
*/
public class Solution2 {
public static int getUgrlyNumber(int index){
if(index<=0){
return 0;
}
int[] result =new int[index];
result[0] =1;
int t2=0,t3=0,t5=0;
for(int i =1;i<index;++i){
result[i] = Math.min(2*result[t2],Math.min(3*result[t3],5*result[t5]));
if(result[i]%2==0){
t2++;
}
if(result[i]%3==0){
t3++;
}
if(result[i]%5==0){
t5++;
}
}
return result[index-1];
}
public static void main(String[] args) {
System.out.println(getUgrlyNumber(10));
}
}