题目描述
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
分析
用一个数组存储丑数,arr[0]存储第一个丑数,第N个丑数存于arr[index-1],并设置三个不同倍数的索引辅助,multiplyOf2、multiplyOf3、multiplyOf5,若乘以一次2,则multiplyOf2++,若乘以一次3,则multiplyOf3++,最后返回arr[index-1]即为第N个丑数(arr[0]存第一个丑数)。图解如下:
实现代码如下:
public class Solution {
public int GetUglyNumber_Solution(int index) {
if(index <= 0){
return 0;
}
//创建一个数组存丑数
int[] arr = new int[index];
arr[0] = 1;//第一个丑数
//第N个数,表示数组中第N-1位置的数,也就是数组中index-1位置的数
int multiplyOf2 = 0; //2的倍数
int multiplyOf3 = 0; //3的倍数
int multiplyOf5 = 0; //5的倍数
for(int i = 1 ; i < index ; i++){
//丑数就是2,3,5倍数的数,即每一个丑数都是前面丑数乘以2,3或者5得到的
int min = Math.min(arr[multiplyOf2]*2, Math.min(arr[multiplyOf3]*3, arr[multiplyOf5]*5));
arr[i] = min;
//乘以相应倍数后,索引自增
if(arr[multiplyOf2]*2 == min){
multiplyOf2++;
}
if(arr[multiplyOf3]*3 == min){
multiplyOf3++;
}
if(arr[multiplyOf5]*5 == min){
multiplyOf5++;
}
}
return arr[index-1];
}
}