一、需求
-
我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。
-
求按从小到大的顺序的第 n 个丑数。
示例:
输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
二、三指针法
2.1 思路分析
- 根据丑数的性质,任意一个丑数都是由小于它的某一个丑数*2、*3或者*5得到的,那么如何得到所有的丑数呢?
- 现在有三个有序数组:A=[1*2,2*2,3*2,4*2,......],B=[1*3,2*3,3*3,4*3,......],C=[1*5,2*5,3*5,4*5,......],所有的丑数就是由这三个有序数组无重复元素合并的结果;
- 那么我们需要三个指针分别指向三个数组,将这三个数组中的元素按升序存储到丑数数组中,最后返回第n个丑数即可;
2.2 代码实现
class Solution {
public int nthUglyNumber(int n) {
if(n <= 0) return 0;
int[] ugly = new int[n];
ugly[0] = 1;
int i = 0;
int j = 0;
int k = 0;
//开始找第1~n个丑数
for(int index = 1; index < n; index++) {
int tmp = Math.min(ugly[i]*2,Math.min(ugly[j]*3,ugly[k]*5));
if(tmp == ugly[i]*2) i++;
if(tmp == ugly[j]*3) j++;
if(tmp == ugly[k]*5) k++;
ugly[index] = tmp;
}
return ugly[n-1];
}
}
2.3 复杂度分析
- 时间复杂度为O(N),其中N为遍历次数;
- 空间复杂度为O(N),定义丑数数组占用O(N)的额外空间;