方法一:
最初写的时候只想到了这一种,最多的优化也就是 i*2,后来想想还是练的少,没有思路。先把测试程序贴出来
public class Solution {
public static void main(String[] args) {
//Scanner sc = new Scanner(System.in);
for(int i=1;i<1010;i++) {
System.out.println(i+":"+GetUglyNumber_Solution(i));;
}
}
public static int GetUglyNumber_Solution(int index) {
if(index==0)
return 0;
int count=1;
int N=-1;
if(index==1)
return 1;
for(int i=2;count<index;i++){
if(isUglyNnumber(i)){
count++;
N=i;
}
}
return N;
}
public static boolean isUglyNnumber(int n){
while(n!=1){
if(n%2==0)
n=n/2;
if(n%3==0)
n=n/3;
if(n%5==0)
n=n/5;
if(n%2!=0&&n%3!=0&&n%5!=0&&n!=1)
return false;
}
return true;
}
}
后来我在实际测试的时候发现,当N=1000左右时,数字运算量会变得很大,于是乎,向大佬们的程序思路取取经,
有了方法二。
方法二:
核心思想就是每一个丑数*2||*3||*5后找出最小的就可以生成下一个丑数,用这种思路,一个数组保存最小的丑数(从小到大),
然后保存index2 index3 index5 的不同迭代值,每次从他们array[index2]*2 array[index3]*3 array[index5]*5中取出最小的,然后
被用到的index值加一。
三个下标就是在维护三个数组,每个数组从1到N
比如:
按列竖着看
index2 index3 index5
1*2 1*3 1*5
2*2 2*3 2*5
.... ....... .......
n*2 n*3 n*5
每一次从三个列中取出最小的一个,然后此列下标+1。
代码如下:
public class Solution {
public int GetUglyNumber_Solution(int index) {
if(index==0)
return 0;
int[] array=new int[index];
int count=1;
array[0]=1;
int min,index2=0,index3=0,index5=0;
while(count<index){
min=Math.min(array[index2]*2, array[index3]*3);
min=Math.min(min, array[index5]*5);
array[count]=min;
if(array[index2]*2<=min)
index2++;
if(array[index3]*3<=min)
index3++;
if(array[index5]*5<=min)
index5++;
count++;
}
return array[index-1];
}
}