1:数组(列表)
(1)双向指针:
前提:数组是有序的
用法:两个指针一前一后,确定好两个指针所指值的关系来调整左右指针的变化朝向
其中要确定好指针什么时候移动是关键
(2)滑动窗口:
遇到返回子数组数目什么的,就要用固定右边看左边的思想
返回长度 值 反正不是子数组数目的,就是枚举右边
主要就是枚举右边,while循环里面是对左指针(l)的操作,记得列表不能超出范围
滑动窗口要考虑单调性,实例如:T560
(3)二分查找:
记住一个例子,找的是>=x的第一个数的位置
其实二分查找不一定需要序列是有序序列,只要在通过比较mid以后能够确定某一部分的元素是否符合要求就行了
(3.1)峰值查找(和mid+1比):
定理:如果 i<n−1 且 nums[i]>nums[i+1],那么在 [0,i] 中一定存在至少一个峰值。而且数组的最后一个元素肯定是确定为蓝色的(峰值或者峰值的右侧),所以不考虑
比较的是m和m+1的大小
(3.2)旋转数组找最小(和最后一个元素比):
(3.3)旋转排序找某个(分类讨论):
抓住染蓝色(mid在target右侧,然后就可以把mid右侧全部删除)的类别,然后仔细分析判断语句怎么写
2:链表
(1)反转链表:
性质:反转结束以后,pre指向反转部分的最后一个节点元素,cur指向反转部分最后一个节点的下一个节点
(2)快慢指针:
定理:长度为奇数的链表,如果快指针在最后一个节点,慢指针一定在中间节点
。。。偶数。。。,。。。。。。。。。。。。。。。。。。。中间节点的第二个节点上
循环退出条件就是:当快指针为空或者下一个为空时结束循环
(2.1)返回环入口
当找到快慢指针相遇点以后,让head指针走,当相等时slow返回的节点即为入口
(3)删除链表
如果需要删除头结点的话才需要加入dummy node
删除重复节点,看当前节点和下一个节点是否一样:
这个题目不需要dummynode的原因是:因为第一个元素不管怎样都不会被删除
这个题目就是要注意删除什么时候停止要考虑清楚
3:二叉树和递归
(1)递归:
循环是会把计算结果返回给一个在循环外的存储单元,但是递归某级返回的值是给上一级用的;
递归最后的尽头,就叫做边界条件
写递归的时候先写边界条件,然后再看判断条件,最后便利左右指针
(2)二叉树:
相同、对称、平衡、右视图
对于我自己来说,其中有一点是判断平衡树的时候,红色框框里面的特别重要:
相当于他可以做到,记录当前节点的高度(就是左右子树最大高度+1)
(3)二叉搜索树:
二叉搜索树就是:节点左边的值小于节点值,节点右边的值大于节点值
(3.1)前序遍历:
就是先访问根节点值 然后递归左子树右子树这样去遍历,就叫做前序遍历
先判断,再次递归,将节点值的范围往 传
(3.1)中序遍历:
先遍历左子树 然后访问根节点 再遍历右子树这样去遍历,就叫做中序遍历
大于上一个节点值
(3.1)后序遍历:
先遍历左子树,再遍历右子树这样去遍历,然后访问根节点,就叫做后序遍历
先递归,再判断,将节点值的范围往上传
(4)二叉树最近公共祖先:
要把分类想清楚