相关链接
视频讲解:单调队列正式登场!| LeetCode:239. 滑动窗口最大值_哔哩哔哩_bilibili
视频讲解:优先级队列正式登场!大顶堆、小顶堆该怎么用?| LeetCode:347.前 K 个高频元素_哔哩哔哩_bilibili
滑动窗口最大值
解题思路——单调队列
文章链接:代码随想录 (programmercarl.com)
单调队列第一次了解,很多地方不是很熟悉,二刷的时候要再理解透彻!!!
AC代码
class Solution {
private:
class MyQueue{
public:
deque<int>que;
void pop(int val)
{
if(!que.empty()&&que.front()==val)
que.pop_front();
}
void push(int val)
{
while(!que.empty()&&que.back()<val){
que.pop_back();
}
que.push_back(val);
}
int front()
{
return que.front();
}
};
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
MyQueue que;
vector<int>result;
for(int i=0;i<k;i++)
{
que.push(nums[i]);
}
result.push_back(que.front());
for(int i=k;i<nums.size();i++)
{
que.pop(nums[i-k]);
que.push(nums[i]);
result.push_back(que.front());
}
return result;
}
};
前K个高频元素
解题思路-优先级队列
这道题目主要涉及到如下三块内容:
- 要统计元素出现频率
- 对频率排序
- 找出前K个高频元素
首先统计元素出现的频率,这一类的问题可以使用map来进行统计(key保存数组存的元素,value保存出现的频数)
然后是对频率进行排序,这里我们可以使用一种 容器适配器就是优先级队列。
补充知识:
定义小顶堆:
在写快排的cmp函数的时候,
return left>right
就是从大到小,return left<right
就是从小到,优先级队列的定义正好反过来了。定义:priority_queue<Type, Container, Functional>
Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式。
AC代码
class Solution {
public:
class mycomparison {
public:
bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) {
return lhs.second > rhs.second;
}
};
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> map;
for (int i = 0; i < nums.size(); i++) {
map[nums[i]]++;
}
priority_queue<pair<int, int>, vector<pair<int, int>>, mycomparison> pri_que;
for (unordered_map<int, int>::iterator it = map.begin(); it != map.end(); it++) {
pri_que.push(*it);
if (pri_que.size() > k) {
pri_que.pop();
}
}
vector<int> result(k);
for (int i = k - 1; i >= 0; i--) {
result[i] = pri_que.top().first;
pri_que.pop();
}
return result;
}
};
遇到的困难&&总结
单调队列和优先级队列都是第一次接触,很多STL库中的底层还不太熟悉,调用也不怎么熟练,思路大概都懂,但是代码这部分还有待提高。