前言
- 花费两个月刷完了代码随想录,通过分类型地学习与做题,让我对算法有了更深入的认识,打下了牢固的基础,感谢代码随想录,感谢carl哥!
一、数组
- 一般数组、字符串(可以转为字符数组)都可以考虑以下方法
二分查找
- 遇到数组有序,且无重复元素
- 数组无序也可考虑排序,有重复元素也可考虑使用二分法查找左右边界
- 时间复杂度O(logn)
- 应用:数组的查找问题
- 题目
双指针
- 快慢指针:两个指针都从头开始,速度不一样。一个for循环实现两个for循环的功能
- 左右指针(对撞指针):两个指针分别从首尾出发,速度看情况。
- 两个指针可以指向同一个数组,也可以分别指向不同数组
- 题目
滑动窗口
- 实际上依赖双指针:快慢指针分别指向窗口左右边界
- 固定窗口大小
- 动态更新窗口大小
- 应用:求某个子串或子数组的最值问题,或求某个目标值。
- 题目
螺旋矩阵
- 模拟,注意边界的判断
- 题目
二、链表
- 操作链表时尽量设置虚拟头节点指向链表头节点,处理完后返回虚拟头节点的next即可,这样不需要对链表头节点单独拉出来处理。
- 链表的增删改查
- 题目
三、哈希表
- 将数组作为哈希表,每个下标对应一个key:一般是限定了输入范围,数字、小写字母、大写字母等
- 求交集、需要去重的情况使用set
- HashMap
- 题目
四、字符串
- 字符串也常用双指针法
- KMP:使用前缀表解决匹配问题和重复子串问题
- 题目