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