JZ33 - 丑数
题目:把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
解题思路:就是按顺序找出下一个丑数,从第一个数一次乘2、3、5找到最小的就是下一个丑数,同时对应的2、3、5下标+1;直到找到第index个丑数。
丑数arr序列:1 2 3 4 5 6 8 9 10 12 15 16 18 20…
定义:乘2对应的下标:int2;乘3对应的下标:int3;乘5对应的下标:int5;
从2开始进行(arr[int2] * 2、arr[int3] * 3、arr[int5] * 5)找最小值
丑数2:(1*2、1*3、1*5)最小值为1*2,同时int2所指的下标+1;当前int2指向2
丑数3:(2*2、1*3、1*5)最小值为1*3,同时int3所指的下标+1;当前int3指向2
丑数4:(2*2、2*3、1*5)最小值为2*2,同时int2所指的下标+1;当前int2指向3
丑数5:(3*2、2*3、1*5)最小值为1*5,同时int5所指的下标+1;当前int5指向2
丑数6:(3*2、2*3、2*5)最小值为3*2和2*3,同时int2和int3所指的下标+1;当前int2指向4,int3指向3
…
/**
* @author 枫叶火火
*/
public class Solution {
static int GetUglyNumber_Solution(int index){
if(index <= 0){
return 0;
}
//创建一个保存丑数的数组
int[] arr = new int[index];
//设置第一个丑数为1
arr[0] = 1;
//下一个乘2或3或5的数组下标值
int int2 = 0;
int int3 = 0;
int int5 = 0;
//逐个进行保存直到保存到第index个数
for(int i = 1 ; i < index ; i++){
//找出当前的最小丑数
arr[i] = Math.min(arr[int2]*2,Math.min(arr[int3]*3,arr[int5]*5));
//判断乘多少等于当前丑数,就把对应相乘的下标值加一
//注意:这里判断不能用if+else 这样会存在重复数字(2*3 和 3*2)所以在等于arr[i]==6时,要把int2和int3都+1
if(arr[i] == arr[int2]*2){
int2++;
}
if(arr[i] == arr[int3]*3){
int3++;
}
if(arr[i] == arr[int5]*5){
int5++;
}
}
return arr[index-1];
}
}