题目:
设计一个算法,找出只含素因子2
,3
,5
的第 n 小的数。
符合条件的数如:1, 2, 3, 4, 5, 6, 8, 9, 10, 12...
思路:最简单的就是从1开始遍历,判断这个数是否满足条件:只含素因子2
,3
,5
,但是这样时间复杂度太高了。
可以换种思路,我们每次保存已经寻找到的丑数,然后设置三个指针 n2, n3, n5, 保存乘2,乘3,乘5的数,每次取这三个数中最小的数。
如果当前保存的下一个数大于等于 指针上的数,则 n++。
代码:
public static int nthUglyNumber(int n) {
// write your code here
int[] arr = new int[n];
arr[0] = 1;
int n2 = 0, n3 = 0, n5 = 0;
int i = 1;
while (i<n){
int min = Math.min(arr[n2]*2, Math.min(arr[n3]*3,arr[n5]*5));
if(min>=arr[n2]*2){ // 当前保存的下一个数大于指针上的数,指针向后移动一位
n2++;
}
if(min>=arr[n3]*3){
n3++;
}
if(min>=arr[n5]*5){
n5++;
}
arr[i] = min;
i++;
}
return arr[n-1];
}