代码随想录算法训练营 | 专题五 栈/队

目录

Day 10 - 栈队 | 2025.1.2

Leetcode 232. 用栈实现队列

Leetcode 225. 用队列实现栈

Leetcode 20. 有效的括号

Leetcode 1047. 删除字符串中的所有相邻重复项

每日一题 731. 我的日程安排表 II

Day 11 - 栈队 | 2025.1.3

Leetcode 150. 逆波兰表达式求值

Leetcode 239. 滑动窗口最大值

Leetcode 347. 前 K 个高频元素

每日一题 732. 我的日程安排表 III


_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]--;

接着码住相信后人智慧 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值