• 无重复字符的最长字串:滑动窗口+heshset,右窗口需要在for外,每轮循环移动右窗口
  • LRU缓存机制:偷懒直接linkedHashMap,hashmap长度并不为cachesize,重写替换条件为size>cachesize,构造函数要传一个允许get后重排序的boolean
  • 反转链表:pre,p,q三指针
  • 数组第k个最大元素:快排思想,根据每次划分的结果二分查找
  • 最大子数组和:动态规划,看前面的是否为负数,为负数就抛弃自己作为开头,为正数就自己加上
  • 合并两个有序链表:模拟题
  • 最长回文字串:二维动态规划,撇去前后剩下的也是回文子串
  • 两数之和:hashmap存余数
  • 二叉树层次遍历:queue秒杀,记得最牢的一集
  • 搜索旋转排序数组:随便划分总有一段是顺序的
  • 岛屿数量:dfs上下左右
  • 全排列:dfs回溯,visited数组
  • 有效的括号:stack秒了
  • 二叉树的最近公共祖先:回溯,找两个列表的最末尾相同元素
  • 环形链表:hashmap看是否包括
  • 反转链表2:模拟
  • 最长递增子序列:动态规划,找前面每一个比自己小的,取最大值+1
  • 字符串相加:太简单不说
  • 接雨水:单调栈,左->右和右->左,取最小值
  • 编辑距离:二维动态规划,需要考虑左右对角线三个,对角线(相同),左右对角线取最大+1(不相同)
  • 最长公共子序列:二维动态规划。比上面的好理解,对角线的+1(相同),左右取最大(不相同)
  • 栈实现队列:两个栈来回倒,一个入一个出,在入之前检查出是否为空,反之亦然
  • 括号生成:左右括号剩余数量判别,右边的数量一定得大于等于左边剩余
  • 反转字符串中的单词:split和stringbuilder
  • 二叉树的锯齿状层次遍历: 基本上就是普通的层次遍历,用reversed就可以倒转。
  • 环形链表2:哈希表存节点,遍历的时候同时检车哈希表是否含有
  • 二叉树右视图:层次遍历
  • 子集:回溯,以1234为例,依次增加子集的元素个数
  • 组合总和:回溯,每次dfs都是传剩余,递归终止条件是剩余<0,=0就添加一条,最后会有重复,需要一个排序+hashset去重
  • 分割回文串: 两步走:首先二维动态规则找到所有的回文字串;再类似prim算法遍历dp数组回溯
  • 单词搜索:回溯,上下左右依次dfs,条件全为或,有一个为真就会是真
  • 找到字符串中所有字母异位词:哈希表(偷懒方法,滑动窗口每一个与目标字符串数组进行比较,用toCharArray和Arrays.sort和equals)
  • 电话号码的字母组合:哈希表写一个键盘集合,然后回溯
  • 重排链表:快慢指针找中点(奇数得在正常中点的后面一个)+后半部分倒转链表+双指针连接
  • 旋转图像:沿着左下右上对角线对调,然后按行按照中线对调
  • 搜索二维矩阵2:四个指针上下左右,逐步缩小范围,当循环内不再发生改变就为真
  • 腐烂的橘子:多源bfs,跟二叉树的层次遍历差不多
  • 课程表:拓扑排序,先记录所有点的入度,每次都找到入度为0的点,如果最后还有入度不为0的说明有环
  • 从前序与中序遍历序列构造二叉树:经典题目,要时不时写一下
  • 实现前缀树:Trim[26]数组,要用一个isend区分是前缀还是单词
  • 有序数组转化为二叉搜索树:二分+递归
  • 单词拆分: 动态规划,当dp[j] == 1 && hashset.contains(s.subString(i,j))时dp[i]=1,字符串在字典里当且仅当划分的两部分应该也在字典里
  • 打家劫舍:经典dp题目,有两种策略,不抢的时候选择上一个两种情况中最大的,抢的时候前一个只能不抢。
  • 最大正方形: 二维dp,dp[i][j]表示以ij为左下角的最大正方形,取左,上,对角线三个里面最小的。
  • 最小路径和:二维dp入门题目,看一眼肯定会
  • 零钱兑换: dp数组长度为钱的多少,dp表示当前钱兑换的最少次数。每次往后移动都需要首尾指针一起动
  • 排序链表: 菜就多练
  • 两数相加:两个链表做加法,太简单了不说,还有个2,就是反转之后相加
  • k个一组翻转链表:虽然是hard但是很简单,思路一定要清晰
  • 二叉树的最大路径和:树形dp,用一个全局变量保存全局最大路径和,返回的时候需要判断子树是否为负数,如果都为负数就返回自己,只要有一个是正数就返回自己+正数
  • 二叉树的直径:跟上面思路是一样的,但是dp返回的是当前树的高度,也是用全局变量保存最大值
  • 打家劫舍3:树形dp,根节点抢了子节点都不能抢了,取其中dp[0]的和再加自己的,不抢就找dp[0]和dp[1]中较大的那个
  • 求根到叶子节点数字之和:深度和广度+回溯
  • 路径总和:回溯
  • 字符串解码: 双栈,存数和字符串,遇到]后进行循环拼接,再将前面的依次出栈直到[
  • 最长连续序列:首先set去重,然后遍历,如果有比当前元素小的就跳过,也就是说每次都找一段里面最小的元素。然后用一个全局变量保存最大的。
  • 最长公共前缀:按列遍历,注意长度是否超出
  • 螺旋矩阵:上下左右四个指针,需要注意只有一列或者一行的情况,在循环的过程中要保持上下界左右界不越界
  • 合并K个升序链表:两两合并即可,或者每次都找最小节点
  • 删除链表的倒数第N个节点:栈先进后出
  • 复制ip地址:回溯,但是还有一点边界没搞明白
  • 二叉树的最大宽度:新建一个内部类,保存编号,左节点是2,右节点是2+1,按层次遍历,找出一层内编号差最大的。
  • 对称二叉树:递归比较左子树和右字数
  • 每种字符至少取k个:反向思维,滑动窗口。先哈希表存所有元素的个数,然后再-k,r随着循环移动,移动一次对应元素个数-1,当哈希表内出现负数元素,左边指针移动并且释放元素直到哈希表内都不为负数。最后取出最大的那次
  • 最小覆盖字串:滑动窗口,首先哈希表保存目标字符的个数。r随着循环移动,每次都从哈希表减去对应字符的个数,如果不在哈希表就跳过。如果哈希表所有元素都小于等于0(也就是说集齐了所有,这里有可能比原来多),那么就记录这个长度,左边指针开始动直到再一次没有集齐元素
  • 二叉树的最大深度:左右子树求最大,dp
  • 平衡二叉树判断,返回一个数组,[0]是高度,[1]是是否平衡
  • 岛屿的最大面积:dfs没什么好说的
  • N皇后:终极回溯题,上下和两侧的对角线都不能有元素重复。设置四个visited数组,然后每一行开始尝试放q,如果能进行到最后一行那就保存,其余就是回溯操作