今日内容:
- 239. 滑动窗口最大值
- 347.前 K 个高频元素
- 总结
239. 滑动窗口最大值 (一刷至少需要理解思路)
队列的应用
使用双端队列,构建单调递减队列,队首元素为最大值,自定义数据结构
class Solution {
private:
class Myqueue{
public:
deque<int> que;//双端队列
void pop(int val){
if(!que.empty() && val == que.front()){
que.pop_front();
}
}
void push(int val){
while(!que.empty() && val > que.back()){
que.pop_back();
}
que.push_back(val);
}
int getMax(){
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.getMax());
for(int i = k; i < nums.size(); i++){
que.pop(nums[i-k]);
que.push(nums[i]);
result.push_back(que.getMax());
}
return result;
}
};
题目链接/文章讲解/视频讲解:代码随想录
347.前 K 个高频元素 (一刷至少需要理解思路)
大/小顶堆的应用, 在C++中就是优先级队列 ,在优先级队列中保存map数组,以value值作为排序比较数值。
class Solution {
public:
//重写比较逻辑
class greater{
public:
bool operator()(const pair<int,int>& key1,const pair<int,int>& key2){
return key1.second > key2.second;
}
};
vector<int> topKFrequent(vector<int>& nums, int k) {
//统计元素出现频率
unordered_map<int,int> map;//键值对形式 key:nums[i] value:出现频率
for(int i = 0; i < nums.size(); i++){
map[nums[i]]++;
}
//对value值排序,小顶堆找前k个元素
priority_queue<pair<int,int>,vector<pair<int,int>>,greater> pri_que;
//将所有map键值对按value值进行小根堆(大小为k)排序
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();
}
}
//保存频率前k高的元素
vector<int> result(k);
for(int i = k - 1; i >= 0; i--){
result[i] = pri_que.top().first;
pri_que.pop();
}
return result;
}
};
题目链接/文章讲解/视频讲解:代码随想录
总结
栈与队列