2019-11-14 12:13:14 +00:00
|
|
|
# [264. Ugly Number II](https://leetcode.com/problems/ugly-number-ii/)
|
2019-10-29 11:59:48 +00:00
|
|
|
# 思路
|
|
|
|
要求第n个ugly数. 由于ugly集合相对于整个int集合是很小的, 所以此题用蛮力法不断判断某个数是否ugly肯定会超时. 所以我们应该从直接构造ugly数着手.
|
|
|
|
|
|
|
|
那么如何直接构造ugly数呢? 根据ugly数的定义可知, 如果x, y, z都是ugly的, 那么2x, 3y, 5z都是ugly数, 所以我们可以从初始x=y=z=1开始不断构造ugly数.
|
|
|
|
|
|
|
|
题目要求第n大的ugly数, 所以可以维护一个从小到大的ugly数组, 每次取2x, 3y, 5z三者最小的push进数组作为下一个ugly数, 详情可见代码.
|
|
|
|
|
2020-02-11 10:25:03 +00:00
|
|
|
时空复杂度均为O(n)
|
|
|
|
|
2019-10-29 11:59:48 +00:00
|
|
|
# C++
|
|
|
|
``` C++
|
|
|
|
class Solution {
|
|
|
|
public:
|
|
|
|
int nthUglyNumber(int n) {
|
|
|
|
vector<int>ugly{1};
|
|
|
|
|
|
|
|
int idx2 = 0, idx3 = 0, idx5 = 0;
|
2020-02-11 10:25:03 +00:00
|
|
|
int tmp2 = 2, tmp3 = 3, tmp5 = 5, next;
|
|
|
|
while(--n){
|
|
|
|
next = min(tmp2, min(tmp3, tmp5));
|
2019-10-29 11:59:48 +00:00
|
|
|
ugly.push_back(next);
|
2020-02-11 10:25:03 +00:00
|
|
|
|
|
|
|
if(next == tmp2) tmp2 = ugly[++idx2] * 2;
|
|
|
|
if(next == tmp3) tmp3 = ugly[++idx3] * 3;
|
|
|
|
if(next == tmp5) tmp5 = ugly[++idx5] * 5;
|
2019-10-29 11:59:48 +00:00
|
|
|
}
|
|
|
|
return ugly.back();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
```
|