/**
* 题目:把只包含质因子2、3和5的数称作丑数(Ugly Number)。
* 例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
* @author hexiaoli
* 思路:剑指offer
* 根据丑数的定义,丑数只能被2、3和5整除。因此一个丑数是另一个丑数乘以2、3或者5的结果(1除外)。
* 基于此可以创建一个数组,里面的数字是排好序的丑数,每一个丑数都是前面的丑数乘以2、3或者5得到的。
* 可以定义三个指针,比较当前丑数分别乘以2、3和5之后值的大小,只存入最小值并移动对应指针。
*/
public class Main {
public static int getUglyNumber_Solution(int num) {
//边界
if(num <= 0) {
return 0;
}
//存储丑数数组
int[] result = new int[num];
//1当做是第一个丑数
result[0]=1;
//存储2、3、5因子的
int curIndex,num2,num3,num5,temp;
curIndex = num2 = num3 = num5 =0;
//遍历
while (curIndex < num-1) {
//比较当前丑数分别乘以2、3和5之后值的大小,只存入最小值并移动对应指针
temp = Math.min(result[num2]*2, Math.min(result[num3]*3, result[num5]*5));
if(temp == result[num2]*2) {
num2++;
}
if(temp == result[num3]*3) {
num3++;
}
if(temp == result[num5]*5) {
num5++;
}
result[++curIndex] = temp;
}
return result[num-1];
}
public static void main(String[] args) {
// System.out.println(getUglyNumber_Solution(-1) );
// System.out.println(getUglyNumber_Solution(1) );
// System.out.println(getUglyNumber_Solution(2) );
// System.out.println(getUglyNumber_Solution(3) );
// System.out.println(getUglyNumber_Solution(4) );
// System.out.println(getUglyNumber_Solution(5) );
// System.out.println(getUglyNumber_Solution(6) );
System.out.println(getUglyNumber_Solution(7) );
// System.out.println(getUglyNumber_Solution(8) );
// System.out.println(getUglyNumber_Solution(9) );
// System.out.println(getUglyNumber_Solution(10) );
}
}