输入:一个整数 n。
要求:找到并返回第 n 个丑数。丑数是质因子只包含 2、3 和 5 的正整数。
输出:第 n 个丑数。
思路:
- 利用集合
std::set的自动排序和去重特性。我们知道第一个丑数是 1,而后续所有的丑数都是由已知的丑数乘以 2, 3 或 5 得到的。 - 创建一个
set来存放丑数候选项,它能自动保持元素从小到大排序。 - 初始时,将第一个丑数
1放入集合。 - 循环
n次,每次从集合中取出最小的元素(即*set.begin()),这个就是当前序列中最小的丑数。 - 每取出一个丑数,就将其乘以
2,3,5后的结果再放回集合中。set会自动处理重复的元素。 - 经过
n次循环后,最后一次取出的就是第n个丑数。
时间复杂度:O(n log n),每次循环都要从集合中提取和插入元素,操作复杂度为对数级。
空间复杂度:O(n),集合需要存储丑数候选项。
class Solution {
public:
int nthUglyNumber(int n) {
set<long> uglyNumbers;
uglyNumbers.insert(1);
int count = 0;
long currentUgly = 1;
while (count < n) {
currentUgly = *uglyNumbers.begin();
uglyNumbers.erase(uglyNumbers.begin());
count++;
uglyNumbers.insert(currentUgly * 2);
uglyNumbers.insert(currentUgly * 3);
uglyNumbers.insert(currentUgly * 5);
}
return (int)currentUgly;
}
};
1869

被折叠的 条评论
为什么被折叠?



