1.leetcode239——滑动窗口最大值
核心思想:单调队列,没有必要维护窗口里所有元素,只需要维护有可能成为窗口里最大值的元素。确保出口处的元素是队列里的最大元素,队列为单调递减队列。
由三个主要函数构成
pop:只有当value==que.front(),才弹出
push:只有当value>que.back()才弹入,否则que.pop_back()
front: return que.front()
main函数:
- 先弹入K个元素,保证队列不为空
- 弹入之后,获得前K个元素的最大值 result.push_back(que.front());
- 再for循环, 依次pop,push,front
注意:
- 每次先判断队列是否为空再进行元素判断
- 先写一个private:
private:
class MYQUE{
public:
deque<int> que;
void pop(int value)
void push(int value)
};
- main 函数里要定义一个队列和一个数组 MYQUE que; vector<int> result;
2.leetcode 347——前k个高频元素
核心思想:
- 用map将元素值和元素频率存进去
- 做一个小顶堆(可以用优先队列),堆顶储存最小元素,堆里始终保持K个元素,当堆的元素大于K时,将堆顶(堆里的最小值)弹出
- 将堆里的元素打印出来,堆顶是最小元素,所以从尾部开始打印,第(k-1)个元素
注释:
- 优先队列默认为大顶堆
priority_queue<pair<int,int>, vector<int,int>, comparsion>
- pair<int, int>: 优先队列中存储的数据类型;
- vector<int, int>L 指定优先队列用vector存储数据
- comparsion: 自定义的排序方法(将大顶堆改为小顶堆)
2. 自定义的排序方法:
comparsion:
class comparsion{
bool operator()(const pair<int,int>& up, const pair<int,int>){
return up.second > down.second;
};
- return true:
- 代表第一个元素大于第二个元素,表示第一个元素应该排在第二个元素之后,远离堆顶
- return false:
- 代表第一个元素小于第二个元素,表示第一个元素应该排在第二个元素之前