丑数进阶版 !到底是第几个丑?
此题是在原来丑数的基础上
寻找第几个丑数
失败尝试
想直接判断打表
1690内的所有丑数
果不其然 超时福利放送
一个个判断不行
那就需要寻找 数据规律 了
观察可得
丑数的基础上乘 2, 3, 5 仍然是丑数 – 简化判断
所以丑数可以由以下列表组成
2 | 1* 2 2 * 2 3 * 2 4 * 2 |
---|---|
3 | 1* 3 2 * 3 3 * 3 4 * 3 |
5 | 1* 2 2 * 2 3 * 2 4 * 2 |
做法:
- 维护三个list – ugly2, ugly3, ugly5
分别储存** now* 2, now* 3, now*5** - 取三个list 开头的 最小值 – 第 cnt 个丑数 (相当于是对丑数的排序过程)
- 直到 cnt 到达 n 为止 – 即取第n个丑数
代码如下:
class Solution {
public:
int nthUglyNumber(int n) {
list<long long> ugly2;
list<long long> ugly3;
list<long long> ugly5;
long long now = 1;
int cnt = 1;
while (cnt != n) {
ugly2.push_back(now * 2);
ugly3.push_back(now * 3);
ugly5.push_back(now * 5);
long long min2 = ugly2.front();
long long min3 = ugly3.front();
long long min5 = ugly5.front();
long long MIN = min(min2, min(min3, min5));
if (min2 == MIN) ugly2.pop_front();
if (min3 == MIN) ugly3.pop_front();
if (min5 == MIN) ugly5.pop_front();
now = MIN;
cnt++;
}
return now;
}
};