题目
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
思路
这道题目自己是有思路的,丑数能够分解成2x3y5^z,
所以只需要把得到的丑数不断地乘以2、3、5之后并放入他们应该放置的位置即可,
而此题的难点就在于如何有序的放在合适的位置。
解题连接
//创建一个数组来存储第i个丑数,
//将丑数乘以2,3,5;取出最小的那个是下一个丑数,
//判断是通过乘2,3,5中那个一数得到的丑数,那么这个指针可以指向下一个,进入下一次判断
//注意:三个指针分别代表的是需要本轮被用来比较的丑数的下标值
public class Solution{
public int GetUglyNumber_Solution(int index) {
if(index<=0) return 0;
int[] arr =new int[index];
int p2=0,p3=0,p5=0;
arr[0]=1;
//思路:
for(int i=1;i<index;i++){
arr[i]=Math.min(arr[p2]*2,Math.min(arr[p3]*3,arr[p5]*5));
if(arr[i]==arr[p2]*2) p2++;
if(arr[i]==arr[p3]*3) p3++;
if(arr[i]==arr[p5]*5) p5++;
}
return arr[index-1];
}
}
复杂度过高
public class Solution {
public int GetUglyNumber_Solution(int index) {
int count=1;
int x=2;
while(count<index){
if(isUglyNumber(x)){
count++;
}x++;
}
return x;
}
public boolean isUglyNumber(int n){
while(n!=1){
if(n%5==0) n/=5;
else if(n%3==0) n/=3;
else if(n%2==0) n/=2;
else break;
}
return n==1;
}
}