丑数概念: 因子中只含2,3,5的数,如1,2,3,4,5,6,8,9,10.......
14中含有除了2,3,5以外的因子7,不符合丑数概念
1被认为是第一个丑数
在此,按照自己的理解,贴上代码,供以相互交流。
//寻找第index个丑数
private static int uglyFound(int index){
int uglyNums[] = new int[index];
int two=0,three=0,five=0;
if (index<=0) return -1;
uglyNums[0]=1;
for(int i=1;i<index;i++){
//寻找在序列中,比最后一个数小,两倍值大于最后一个数的 第一个数
for(int j=0;j<i;j++){
if( (2*uglyNums[j]) > uglyNums[i-1]){
two = uglyNums[j]*2;
break;
}
}
//寻找在序列中,比最后一个数小,三倍值大于最后一个数的 第一个数
for(int j=0;j<=i;j++){
if((uglyNums[j]*3) > uglyNums[i-1]){
three = uglyNums[j]*3;
break;
}
}
//寻找在序列中,比最后一个数小,五倍值大于最后一个数的 第一个数
for(int j=0;j<=i;j++){
if((uglyNums[j]*5) > uglyNums[i-1]){
five = uglyNums[j]*5;
break;
}
}
uglyNums[i]=min(two,three,five);
}
return uglyNums[index-1];
}
在这种情况下,时间复杂度还是有O(N^2),效率并不是很好,因此考虑以空间换取时间做法的另一种高效做法(C++版可参考《剑指offer》书籍)
<span style="white-space:pre"> </span>private static int min(int a,int b,int c){
<span style="white-space:pre"> </span>int min =(a<b)? a:b;
return (min<c)? min:c;
}
//寻找第index个丑数
private static int uglyFound(int index){
int uglyNums[] = new int[index];
int two=0,three=0,five=0;
if (index<=0) return -1;
uglyNums[0]=1;
for(int i=1;i<index;i++){
uglyNums[i]=min(2*uglyNums[two] ,3*uglyNums[three],5*uglyNums[five]);
if (uglyNums[i]== 2*uglyNums[two] ) two++;
if (uglyNums[i]== 3*uglyNums[three] ) three++;
if (uglyNums[i]== 5*uglyNums[five] ) five++;
}
return uglyNums[index-1];
}
这样,只需遍历一遍数组即可。