题目链接:264. Ugly Number II
题目大意:输出第n个顺序的丑数,丑数的定义为一个数的质因子只能是2,3,5.
例子:
- 6是丑数,6 = 2 * 3
- 8是丑数,8 = 2 * 2 * 2
- 14不是丑数, 14 = 7 * 2. 包含了7
一.算法设计
由于判断一个数的时间复杂度并不高,但是判断一系列的数,那么这样的时间消耗是不行的。所以我们只需要判断一些丑数的顺序,这里利用到丑数的一个性质:丑数的2,3,5倍数也一定是丑数
所以,我们这里只需要对于一个数的2,3,5倍数来进行排序,每次选择其中最小的值放入数组中,直到放入到第n个数,最后的元素即是我们需要的第N个丑数。
转移方程: val = min(v[unum2]*2,min(v[unum3]*3,v[unum5]*5))
二.算法实现
class Solution {
public:
int nthUglyNumber(int n) {
vector<int> v{1};
int unum2 = 0, unum3 = 0, unum5 = 0;
while(--n > 0){
int val = min(v[unum2]*2,min(v[unum3]*3,v[unum5]*5));
v.push_back(val);
// 判断排序,去除重复的
while(v[unum2]*2 <= val) unum2++;
while(v[unum3]*3 <= val) unum3++;
while(v[unum5]*5 <= val) unum5++;
}
return v.back();
}
};