今天是农历2021的最后一天,leetcode贴心的给了一道简单。这是一个经典的TopK问题,可以用排序时间复杂度在logN的算法解决。注意priority_queue是对堆排序的应用,但是需要决定对什么container维护堆排序:priority_queue<Type, Container, Functional>,Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector!当我们采用升序的优先队列时需要手动指定container:
//升序队列
priority_queue <int,vector<int>,greater<int> > q;
//默认降序队列
priority_queue <int>q;
priority_queue代码:
class KthLargest {
public:
int k;
priority_queue<int,vector<int>,greater<int>> q;
KthLargest(int k, vector<int>& nums) {
this->k = k;
q = priority_queue<int,vector<int>,greater<int>>();
for(int i=0;i<nums.size();i++)
q.push(nums[i]);
}
int add(int val) {
q.push(val);
while(q.size()>k)
q.pop();
return q.top();
}
};
/**
* Your KthLargest object will be instantiated and called as such:
* KthLargest* obj = new KthLargest(k, nums);
* int param_1 = obj->add(val);
*/
multiset代码:
class KthLargest {
public:
int k;
multiset<int> m_set;
KthLargest(int k, vector<int>& nums) {
this->k = k;
m_set.clear();
for(int i=0;i<nums.size();i++)
m_set.insert(nums[i]);
}
int add(int val) {
m_set.insert(val);
while(m_set.size()>k)
m_set.erase(m_set.begin());
return *m_set.begin();
}
};
/**
* Your KthLargest object will be instantiated and called as such:
* KthLargest* obj = new KthLargest(k, nums);
* int param_1 = obj->add(val);
*/