目录
_stack overflow_
栈stack - 先进后出,只能对栈顶元素进行操作

队queue - 先进先出

双端队列deque


优先队列priority_queue

设置优先级
priority_queue<int> q1; / 默认大根堆, 即每次取出的元素是队列中的最大值
priority_queue<int, vector<int>, less<int> > q2; / 大根堆, 每次取出的元素是队列中的最大值,同第一行
priority_queue<int, vector<int>, greater<int> > q3; / 小根堆, 每次取出的元素是队列中的最小值
自定义比较规则
struct Point {
int x, y;
};
//定义的比较结构体
//注意:cmp是个结构体
struct cmp { / 自定义堆的排序规则
bool operator()(const Point& a,const Point& b) {
return a.x < b.x;
}
};
//初始化定义,
priority_queue<Point, vector<Point>, cmp> q; / x大的在堆顶
Day 10 - 栈队 | 2025.1.2
Leetcode 232. 用栈实现队列
pop和peek前若第二个栈为空要先将第一个栈的元素全部放入第二个栈中
Leetcode 225. 用队列实现栈
1. 两个队列一个操作一个备份
2. 一个队列除最后一项只pop外其余均push到队尾
栈是top;队列和vector是front和back;
栈和队是push 和 pop;双端队列和vector要指明前后
Leetcode 20. 有效的括号
最早出现的左括号对应的右括号最晚出现 ----> 栈
思路:遇到左则插入右,遇到右则弹出--不一致说明不匹配
Leetcode 1047. 删除字符串中的所有相邻重复项
每个元素和栈顶元素比较,相同则抵消(pop)不同或栈空则插入
最后的栈组成一个字符串,记得reverse
每日一题 731. 我的日程安排表 II
好好好判断是否重叠还不够,三个日程重叠才算叠,三折叠怎么折都写不出来
先码住吧没学过线段树,二叉树也没学透彻,相信后人智慧
Day 11 - 栈队 | 2025.1.3
Leetcode 150. 逆波兰表达式求值
经典栈实现计算功能:
若当前token为数字,则入栈
若当前token为运算符,则出栈*2,结果入栈,注意减法和除法的顺序
* 判断字符串是否为数字可以先判断运算符再else;或用std::isdigit
* 字符串转为数字同字符串专题的一道每日一题
int ans = stoi(s1, 0, 2); (string input, 0, 转换进制(默认10))i表示int
Leetcode 239. 滑动窗口最大值
个人理解的一个解法:deque最前端存当前滑动窗口最大值的索引
若索引不在窗口内则pop_front
循环pop_back掉所有比当前值小的值对应的索引
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> result;
deque<int> que;
for(int i=0;i<nums.size();i++){
if(!que.empty() && que.front()+k<=i) que.pop_front();
while(!que.empty()&&nums[que.back()]<nums[i]) que.pop_back();
que.push_back(i);
if(i>k-2)result.push_back(nums[que.front()]);
}
return result;
}
};
随想录的解决方法中如何处理上一个最大值如果不在当前窗口该如何弹出,弹出条件不好想
如果存索引,直接que.front()+k<=i解决边界问题
Leetcode 347. 前 K 个高频元素
第一次用优先队列真不熟悉,回调函数cmp形式:
- 普通函数
- 函数对象(伪函数)
- Lambda 表达式
priority_queue<T, Container, Compare>
二叉堆 ≠ 链表结构的树。虽然逻辑上是树,但实际上用数组来表示。
思路:先用哈希存储所有元素出现的频率,
再用小顶堆对所有键值对根据值大小排序(只维护前K大的,k+1个元素时pop掉当前最小值)
每日一题 732. 我的日程安排表 III
怎么还有三啊喂
差分数组并不理解为什么
cnt[end]--;
接着码住相信后人智慧

2560

被折叠的 条评论
为什么被折叠?



