题目描述:
把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
思路:
1是第一个丑数,后面的丑数都是前面的丑数分别与 2 ,3, 5相乘的结果。把这些丑数从小到大排列放在数组里面,最后只需要返回数组的最后一个元素就可以了。
具体的排列: a表示存放丑数的数组,a[0] = 1,m2,m3,m5分别代表2,3,5的倍数所在的位置。刚开始都为0。循环的条件是i<index , i 从1开始,index-1代表第n个丑数的位置,也就是数组的长度。每次将a[m2]*2, a[m3]*3, a[m5]*5中最小的值放在数组中,如果当前a[m2]*2最小,则m2++,依次类推,这样,每次比较后的最小的值所在的m递增。
对于index=5,
m2,m3, m5分别与2,3,5相乘,比较大小
代码实现:
public static int GetUglyNumber_Solution(int index) {
if(index <= 0){
return 0;
}
// 1为第一个丑数
int[] a = new int[index];
a[0] = 1;
int m2 ,m3 ,m5 ,i;
m2 = m3 = m5 = 0;
i = 1;
while(i<index){
// 将三者中的最小值给当前的a[i]
a[i] = min(a[m2]*2, a[m3]*3, a[m5]*5);
if(a[m2]*2 <= a[i]){
m2++;
}
if(a[m3]*3 <= a[i]){
m3++;
}
if(a[m5]*5 <= a[i]){
m5++;
}
i++;
}
return a[index-1];
}
//求最小值
public static int min(int a, int b, int c) {
int min = (a < b) ? a : b;
return (min < c) ? min : c;
}