一. 数组
1.1 二分查找
二分查找是经典的查找方式,需要熟练运用,步骤为定义左右两个指针,取中间指针并不断向目标值逼近,需要注意的是区间左闭右闭和左闭右开时的右指针更新方式不同。
很好的一道题,二分查找不止可以寻找目标值,还可以寻找边界,这点要重点掌握
2.2 螺旋矩阵
循环时左闭右开,边界一定要清晰
二. 链表
2.1 设计链表
这道题可以帮助充分理解链表的构成。
2.2 反转链表
2.3 交换链表节点
虚拟头节点的引入可以使链表问题更容易解决,这道题是个很好的例子
2.4 删除链表倒数第N个节点
想到用双指针后解题就很容易,只要将两个索引的间距设为n即可,总结出一个规律,像链表这种无法直接找到最后一个结点,但题目又明确要求从后面开始,应该都可以用双指针来解决,不知道这个规律对不对,多刷刷题试一下。
三. 哈希表
3.1 几数之和
经典的哈希问题。
较前面两题更难一些,关键在于是在一个数组中进行操作,涉及到去重操作,一道精品题,需要反复理解。
四. 字符串
4.1 KMP
KMP算法应重点掌握。
KMP:文本串、模式串、前缀表
前缀:包含第一个字符,不包含最后一个字符的所有字串都是前缀
后缀:包含最后一个字符,不包含第一个字符的所有字串都是后缀
最长相等前后缀:前缀和后缀相同且数量相等
例:
文本串:aabaabaaf
模式串:aabaaf
前缀表:010120
next数组:遇见冲突位置向前回退,不同形式会有出入,但原理相同
具体代码步骤:初始化、前后缀不相同、前后缀相同、更新next
五. 栈与队列
5.1 滑动窗口最大值
自己定义队列,可以更轻松的解决问题。
5.2 前K个高频元素
需要了解priority_queue这种队列,并对大顶端和小顶端有准确的理解,值得一看