239. 滑动窗口最大值 (一刷至少需要理解思路)
之前讲的都是栈的应用,这次该是队列的应用了。
本题算比较有难度的,需要自己去构造单调队列,建议先看视频来理解。
题目链接/文章讲解/视频讲解:代码随想录
class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {deque<int>d1;vector<int>v1;if (k==1)return nums;for (int i=0;i<k;i++){while (!d1.empty() && d1.back()<nums[i])d1.pop_back();d1.push_back(nums[i]);}v1.push_back(d1.front());for (int i=k;i<nums.size();i++){if (d1.front()==nums[i-k])d1.pop_front();while (!d1.empty() && d1.back()<nums[i])d1.pop_back();d1.push_back(nums[i]);v1.push_back(d1.front());}return v1;}
};
总结
虽然二刷的时候已经把这道题快给忘完了,但看了思路还是可以写出来,我觉得还可以。
在写这道题遇到了点问题,总结了一下:
1.如果可以把这道题分成两个部分来写,就分成两个部分来写,即使答案是i=0到i=nums.size(),但我们写的时候没必要,可以写出来就已经可以了
2.要弄清楚步骤,一定是先删,再加,最后找滑动窗口里的最大值,这个一定要想清楚,不能弄错了。
347.前 K 个高频元素 (一刷至少需要理解思路)
大/小顶堆的应用, 在C++中就是优先级队列
本题是 大数据中取前k值 的经典思路,了解想法之后,不算难。
题目链接/文章讲解/视频讲解:代码随想录
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; // map<nums[i],对应出现的次数>for (int i = 0; i < nums.size(); i++) {map[nums[i]]++;}// 对频率排序// 定义一个小顶堆,大小为kpriority_queue<pair<int, int>, vector<pair<int, int>>, mycomparison> pri_que;// 用固定大小为k的小顶堆,扫面所有频率的数值for (unordered_map<int, int>::iterator it = map.begin(); it != map.end(); it++) {pri_que.push(*it);if (pri_que.size() > k) { // 如果堆的大小大于了K,则队列弹出,保证堆的大小一直为kpri_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;}
};
总结
思路是明白了,但这小顶堆怎么实现确实还没有看明白,等我去学习一下再来看。