题目描述:把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
思路解析:
- 首先,丑数的定义要明确,只能被2、3、5整除;
- 其次,两种方法:基本方法是挨个去检查是不是只能够被2、3、5整除,一条道走到黑,剩下的数字是1就是丑数,否则不是;另一种方法是,丑数的2倍、3倍、5倍还是丑数,只要确定从小到大的顺序就可以了。
- 优化方法详解:初始化数组uglyNumber[0]=1;
- 然后从{uglyNumber[0]*2、uglyNumber[0]*3、uglyNumber[0]*5}中去找最小的数作为下一个丑数,显然是2,uglyNumber[1]=2;
- 接着{uglyNumber[1]*2、uglyNumber[0]*3、uglyNumber[0]*5}去找下一个丑数,uglyNumber[2]=3;
- 接着{uglyNumber[1]*2、uglyNumber[1]*3、uglyNumber[0]*5}去找下一个丑数,uglyNumber[3]=4;......
- 注意下标的变化可以再去声明三个变量分别控制×2、×3、×5的下标。
代码:
public class Solution {
public int GetUglyNumber_Solution(int index) {
if(index<=0){
return 0;
}
int[] uglyNumbers = new int[index];
uglyNumbers[0]=1;
int nextUglyIndex = 1;
int p2=0;
int p3=0;
int p5=0;
while (nextUglyIndex<index){
int min = min(uglyNumbers[p2]*2,uglyNumbers[p3]*3,uglyNumbers[p5]*5);
uglyNumbers[nextUglyIndex]=min;
while(uglyNumbers[p2]*2<=uglyNumbers[nextUglyIndex])
p2++;
while(uglyNumbers[p3]*3<=uglyNumbers[nextUglyIndex])
p3++;
while(uglyNumbers[p5]*5<=uglyNumbers[nextUglyIndex])
p5++;
nextUglyIndex++;
}
return uglyNumbers[--nextUglyIndex];
}
private static int min(int a,int b,int c){
int min=a>b?b:a;
return min = min>c?c:min;
}
}