239. 滑动窗口最大值
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
文档讲解:代码随想录
视频讲解:单调队列正式登场!| LeetCode:239. 滑动窗口最大值_哔哩哔哩_bilibili
思路:采用单调队列,队列中只维护前k个元素中最大值及后面的元素,保证前k个元素的最大值始终在队列的头部
C++代码:
class Solution {
public:
class CMyQueue{
private:
deque<int> in;
public:
void Pop(int val){
if(!in.empty() && in.front() == val)
in.pop_front();
}
void Push(int val){
while(!in.empty() && val > in.back()){
in.pop_back();
}
in.push_back(val);
}
int GetMax(){
return in.front();
}
};
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
CMyQueue queue;
vector<int> result;
for(int i = 0; i < k; i++)
queue.Push(nums[i]);
result.push_back(queue.GetMax());
for(int i = k; i < nums.size(); i++){
queue.Pop(nums[i - k]);
queue.Push(nums[i]);
result.push_back(queue.GetMax());
}
return result;
}
};
347.前 K 个高频元素
题目链接:
文档讲解:
视频讲解:优先级队列正式登场!大顶堆、小顶堆该怎么用?| LeetCode:347.前 K 个高频元素_哔哩哔哩_bilibili
思路:对于元素数量的统计采用map方式,key为元素值value为该元素出现的次数。题目要前k个高频元素,采用小顶堆(本质是二叉树)方式
C++代码:
class Solution {
public:
class CMyCom{
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;
vector<int> result(k);
for(int i = 0; i < nums.size(); i++)
map[nums[i]]++;
//定义小顶堆
priority_queue<pair<int, int>, vector<pair<int, int>>, CMyCom> pri;
for(auto it = map.begin(); it != map.end(); it++){
pri.push(*it);
if(pri.size() > k)
pri.pop();
}
for(int i = k - 1; i >=0; i--){
result[i] = pri.top().first;
pri.pop();
}
return result;
}
};