把C++重拾起来系统刷题的第一周(4.16-4.23),也是同时为了复习数据结构与准备夏令营机试。
计划着主要是结合Acwing算法基础课的章节进行,同时也会穿插二刷之前用Java刷过的力扣题
目录
链表:
基于数组模拟链表的模板题:Acwing 826 Acwing 827
应用:Leetcode 707. 设计链表
双指针:
经典题:Leetcode 151. 反转字符串中的单词
链表双指针:142. 环形链表 II
栈与队列:
应用:Leetcode 20. 有效的括号
经典问题之逆波兰表达式:
Leetcode 150. 逆波兰表达式求值 Acwing 3302
单调栈:
模板题:Acwing 830
应用:Leetcode 739 每日温度 也可以参照carl的这篇题解更好理解
Leetcode 1944 队列中可以看到的人数
Leetcode 496 下一个更大元素 I
Leetcode 503 下一个更大元素 II
单调队列:
即经典的滑动窗口问题,需要通过deque实现
模板题:Acwing 154 滑动窗口(提交记录中有两个版本:用数组模拟deque与直接使用STL)
应用:Leetcode 239 滑动窗口最大值(用y总模板的思想非常轻松地ac了这道困难题)
优质题解:AcWing 154. 滑动窗口---$\color{red}{海绵宝宝来喽}$ - AcWing
堆:
模板题:Acwing 838 堆排序
参照了以下两篇题解,对创建堆与堆排序有了更清楚的认识:
https://www.acwing.com/solution/content/120483/
AcWing 838. 堆排序 分析i=n/2 - AcWing
同时学习了底层基于堆排序实现的priority_queue的用法,其默认实现的是大根堆
(参考了这篇博客) 若需要实现小根堆或自定义排序方式,则需要:
priority_queue<int, vector<int>, less<int> >pq;
//最后两个>之间要有空格
第二个参数:
vector< int > 是用来承载底层数据结构堆的容器,若优先队列中存放的是double型数据,就要填vector< double >
总之存的是什么类型的数据,就相应的填写对应类型。
第三个参数:
less< int > 表示数字大的优先级大,堆顶为最大的数字 即大根堆
greater< int >表示数字小的优先级大,堆顶为最小的数字 即小根堆
int代表的是数据类型,也要填对应的类型(参考了C++中创建大根堆与小根堆与作用)
而 LeetCode 347. 前 K 个高频元素 中使用了自定义排序方法
通过此题也学习了pair的相关知识,其底层通过结构体实现,相当于map容器中的键值对元素
详情可见:https://blog.csdn.net/sevenjoin/article/details/81937695
哈希表:
模板:Acwing 840 模拟散列表
STL运用:Leetcode 454 四数相加
字符串哈希:
模板:Acwing 841 模板题:Acwing 138
Leetcode 187 重复的DNA序列
字符串哈希模板中也蕴含着前缀和的思想,于是复习了算法基础课中的相关内容:
前缀和:Acwing 795 题解 二维前缀和:Acwing 796 题解
差分(即前缀和的逆过程):Acwing 797 题解 二维差分:Acwing 798 题解