题目描述
我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。
示例
输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
提示
- 1 是丑数。
- n 不超过1690。
解题思路
- 创建一个队列,将丑数 1 放入队列;
注意:这个队列里面不能出现重复的数字。 - 从队列中往外拿丑数,拿出后将当前的数字的 2、3、5 倍的值加到队尾;
- 只到取出第 n 个数,返回这个数。
代码
class Solution {
public:
int nthUglyNumber(int n) {
set<int64_t> queue; // 避免出现重复数字,用 set 来模拟一个队列
queue.insert(1); // 1 是第一个丑数
int64_t count = 0; // 记录已取出的数的个数
int64_t temp;
while(count < n){ // 取出的第 n 个数就是要返回的结果
temp = *queue.begin(); // 取出队首的数字
count++; // 取出数 +1
queue.erase(queue.begin()); // 删除队首元素
// 将取出的队首元素的 2、3、5 倍的数放进队列
queue.insert(temp * 2);
queue.insert(temp * 3);
queue.insert(temp * 5);
}
return temp;
}
};
提交结果
总结
- 太久没使用容器,好多函数的使用方法都记不清了,过两天把容器这块再看一看。