丑数(广搜)
题意
找第n个丑数,丑数:只包含2,3,5
质因子的数
思路分析
考虑合法值
因为只是2,3,5
的倍数,所以合法的值表示为
从小到大维护
从第一个找到第n
个,每一次需要找还未找到过的最小值
通过set
或小根堆,都可以实时的维护还未扩展的最小值,(小根堆要注意的是需要手动处理重复值
候选最小值
当一个值被选择时,如果它是
那么,, 都还未被选择
且如果有各个幂次都大于当前幂次的值,它比这三个值都大,一定在这三个值之后
因此每个被选值,可以扩展出三个候选值
题目样例
以题目样例n=7
为例, 候选值如图所示,最后输出候选值中最小的即可
题解
所以整合上面的内容
class Solution {
public:
int GetUglyNumber_Solution(int index) {
if(index == 0) return 0;
set<long long> s; // 候选值
s.insert(1); // 初始值
while(s.size()){
auto v = *s.begin(); // 最小的
s.erase(s.begin());
if(!--index)return v; // 满足个数
s.insert(v*2); // 扩展*2
s.insert(v*3); // 扩展*3
s.insert(v*5); // 扩展*5
}
return -1;
}
};
复杂度分析
空间复杂度: 用了set
保存扩展还未选择的数,大小和查找的个数相当,所以空间复杂度为
时间复杂度: 每次取最小的,每次扩展3个,都是常数级别,所以时间复杂度为