公式
常数
整型最大值 Integer.MAX_VALUE 整型最小值 Integer.MIN_VALUE
构造栈
Stack<TreeNode> stack = new Stack<>()
构造队列
Queue<TreeNode> queue = new LinkedList<TreeNode>()
循环链表的入口,如图所示:
假设从头结点到环形入口节点 的节点数为x。 环形入口节点到 fast指针与slow指针相遇节点 节点数为y。 从相遇节点 再到环形入口节点节点数为 z。 x = (n - 1) (y + z)
技巧
循环不变量规则
二分法经常写乱,主要是因为对区间的定义没有想清楚,区间的定义就是不变量。要在二分查找的过程中,保持不变量,就是在while寻找中每一次边界的处理都要坚持根据区间的定义来操作,这就是循环不变量规则。 写二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。
双指针(快慢指针)
双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。 解决问题:寻找链表中位节点、反转列表、最短子序列、删除倒数第n个节点、循环链表的入口
滑动窗口
也是双指针,取双指针之间的集合。像一个正在滑动的窗口,所以也叫做滑动窗口的思想。滑动窗口最重要的精华是一个for循环做两个for循环的事情。 for循环j指向的是终止位置,起始位置需要用一个动态移动的策略去确定,这样才能用一个for循环的思路解决两个for循环能做的事情。这也是滑动窗口的精华所在,滑动窗口最重要的一个思路就是如何移动起始位置。 解决问题:最短子序列
虚拟头结点
通过设置一个虚拟头结点dummyHead可以按照统一的方式进行链表节点的移除和添加操作。 解决问题:链表增删的统一
哈希表
当我们想使用哈希法来解决问题的时候,我们一般会选择如下三种数据结构。 数组 set (集合) map(映射)