题目描述
把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
在线编程:
public class Solution {
public int GetUglyNumber_Solution(int index) {
/*
拿到题目初步的想法即就是
所谓的一个数m是另一个数n的因子,是指n能被m整除,也就是n%m==0
根据丑数的定义,丑数只能被2,3,5整除。也就是说如果一个数能被2整除,我们把它连续除以2;
如果能被3整除,就连续除以3;
如果能被5整除,就连续除以5;
如果最后我们得到的是1,那么这个数就是丑数,否则不是
if(index<=0){
return 0;
}
int number=0;
int uglyFound=0;
while(uglyFound<index){
++number;
if(IsUgly(number)){
++uglyFound;
}
}
return number;
}
public boolean IsUgly(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;
}
*/
//第二种方法
if(index<=0){
return 0;
}
int [] pUglynumber=new int[index]; //存放丑数的数组
pUglynumber[0]=1;//1就是最小的丑数
int nextuglyindex=1; //下一个丑数的索引
int p2=0;
int p3=0;
int p5=0;
while(nextuglyindex<index){
//分别用2,3,5乘以丑数,求出最小的丑数
int min=min(pUglynumber[p2]*2,pUglynumber[p3]*3,pUglynumber[p5]*5);
pUglynumber[nextuglyindex]=min;//则丑数数组中下一个丑数即就是min最小的这个丑数,本题即就是2
if(pUglynumber[p2]*2<= pUglynumber[nextuglyindex]) {
p2++;//然后p2++;p2=1
}
if(pUglynumber[p3]*3<= pUglynumber[nextuglyindex]) {
p3++;
}
if(pUglynumber[p5]*5<= pUglynumber[nextuglyindex]) {
p5++;
}
nextuglyindex++; //nextuglyindex=2
}
return pUglynumber[nextuglyindex-1];//第index-1个丑数
}
public int min(int n1,int n2,int n3){
int min=n1<n2? n1:n2;
return min<n3? min:n3;
}
}
再看看别人写的,基本思想一致:简介清晰明了public class Solution {
public int GetUglyNumber_Solution(int index) {
if(index == 0)
{
return 0;
}
ArrayList<Integer> res = new ArrayList<Integer>();
res.add(1);
int i2=0,i3=0,i5=0;
while (res.size() < index) {
int m2 = res.get(i2) * 2;
int m3 = res.get(i3) * 3;
int m5 = res.get(i5) * 5;
int min = Math.min(m2, Math.min(m3, m5));
res.add(min);
if(min==m2) i2++;
if(min==m3) i3++;
if(min==m5) i5++;
}
return res.get(res.size()-1);
}
}