0313超级丑数
题目
https://leetcode-cn.com/problems/super-ugly-number/
方法一:最小堆
class Solution {
public:
int nthSuperUglyNumber(int n, vector<int>& primes) {
//使用优先队列来构建最小堆,依次取出最小堆的堆顶元素,取n次
priority_queue<long,vector<long>,greater<long>> heap;
//定义数组记录第n个数
set<long> seen;
heap.push(1);
seen.insert(1);
long cur=0;
for(int i=0;i<n;i++)
{
cur=heap.top();
heap.pop();
for(long j:primes)
{
long flag=j*cur;
//如果成功插入到set中,就把seen加入到堆里面
if(seen.insert(flag).second)
heap.push(flag);
}
}
return (int)cur;
}
};
priority_queue
-
定义了一个元素有序排列的队列。默认队列头部的元素优先级最高。因为它是一个队列,所以只能访问第一个元素,这也意味着优先级最高的元素总是第一个被处理
-
模板有 3 个参数,其中两个有默认的参数;第一个参数是存储对象的类型,第二个参数是存储元素的底层容器,第三个参数是函数对象,它定义了一个用来决定元素顺序的断言
template <typename T, typename Container=std::vector<T>, typename Compare=std::less<T>> class priority_queue
//最大堆的定义 priority_queue <int,vector<int>,less<int> > p; //最小堆定义 priority_queue <int,vector<int>,greater<int> > q;
-
push(const T& obj):将obj的副本放到容器的适当位置,这通常会包含一个排序操作。
pop():移除第一个元素。
top():返回优先级队列中第一个元素的引用。
set
-
insert(key_value);
将key_value插入到set中 ,返回值是pair<set::iterator,bool>,bool标志着插入是否成功,而iterator代表插入的位置,若key_value已经在set中,则iterator表示的key_value在set中的位置。