| 1.两数之和 | 哈希表 |
| 2.两数相加 | 链表操作 |
| 3. 无重复字符的最长子串 | 滑动窗口,特别注意数组越界情况! |
| 4. 寻找两个正序数组的中位数 | |
| 5.最长回文子串 | 从中间向两边扩展,注意整个字符串都是回文串的边界情况 |
| 10.正则表达式匹配 | 动态规划,要在两个字符前都加个空格 |
| 11.盛水最多的容器 | 左右双指针 |
| 15.三数之和 | 排序+双指针+剪枝 |
| 17.电话号码的字母组合 | 回溯 |
| 19.删除链表的倒数第N个节点 | 快慢指针 |
| 20.有效的括号 | 栈,注意栈pop前需要判断是否为空 |
| 21.合并两个有序链表 | 双指针 |
| 22.括号生成 | 回溯法,用变量记录能生成的右括号数 |
| 23.合并K个升序链表 | 堆 |
| 31.下一个排列 | |
| 32.最长有效括号 | |
| 33.搜索旋转排序数组 | 二分查找,有序的那一半的范围是可以确定的 |
| 34.在排序数组中查找元素的第一个和最后一个位置 | 二分查找 |
| 39.组合总和 | 回溯,先排序数组剪枝 |
| 42.接雨水 | 每一格能接的水是左右两边最大值的较小值减这格的水 |
| 46.全排列 | 回溯 |
| 48.旋转图像 | 先对角线,再轴对称 |
| 49.字母异位词分组 | 将字母排序后作为哈希值 |
| 53.最大子数组和 | 动态规划,dp[i]为以第i个数为结尾的最大子数组和 |
| 55.跳跃游戏 | 贪心,不断延伸能跳的范围,看能否超过最大长度 |
| 56.合并区间 | 贪心,按左边界从小到大排序,不断延伸右边界 |
| 62.不同路径 | 动态规划 |
| 64.最小路径和 | 动态规划 |
| 70.爬楼梯 | 动态规划 |
| 72.编辑距离 | dp[i][j] = min(dp[i][j-1], dp[i][j],dp[i-1][j])+1 (s[i] != p[j]) dp[i][j] = dp[i-1][j-1] (s[i] = p[j]) |
| 75.颜色分类 | 快慢指针,慢指针必须从-1开始,无论相不相等都交换! |
| 76.最小覆盖子串 | 滑动窗口,用一个哈希表来记录字母的次数 |
| 78.子集 | 回溯 |
| 79.单词搜索 | 回溯 |
| 84.柱状图中的最大矩形 | |
| 85.最大矩形 | |
| 94.二叉树的中序遍历 | 迭代借用栈,不断压入左子树,左子树压入完了再压入右子树 |
| 96.不同的二叉搜索树 | 动态规划 |
| 98.验证二叉搜索树 | 递归遍历需带有这棵树的最大最小值,用long变量 |
| 101.对称二叉树 | 递归 |
| 102.二叉树的层序遍历 | 借助队列,遍历每层前获取当前队列的数量确定该层的元素个数 |
| 104.二叉树的最大深度 | 递归 |
| 105.从前序与中序遍历构造二叉树 | 通过前序遍历将二叉树一分为二,递归构建 |
| 114.二叉树展开为链表 | 递归 |
| 121.买卖股票的最佳时机 | 一次遍历,用一个变量记录之前的最低值 |
| 124.二叉树中的最大路径和 | |
| 128.最长连续序列 | 剪枝,如果比当前数小1的数存在,则跳过 |
| 136.只出现一次的数字 | 位运算,数异或自己等于0 |
| 139.单词拆分 | 动态规划 |
| 141.环形链表 | 快慢指针 |
| 142.环形链表2 | 快慢指针,第一次相遇后将慢指针重新指向头节点,再次相遇即为交点 |
| 146.LRU缓存 | 双向链表+哈希表。记录头节点、尾节点,初始化时需要建虚拟节点;先写好插入头部和删除节点方法;操作完链表后记得操作哈希表! |
| 148.排序链表 | 堆。归并排序,先用快慢指针找到链表的中点,对两边分别排序,合并两个有序链表 |
| 152.乘积最大子数组 | 两个dp数组,分别记录以dp[i]结尾的最大最小值,根据nums[i]的正负号来确定dp[i] |
| 155.最小栈 | 通过辅助栈判断,注意判断相等用equals |
| 160.相交链表 | 哈希表。快慢指针 |
| 198.打家劫舍 | 动态规划 |
| 200.岛屿数量 | 深度优先 |
| 206.反转链表 | 递归方式,head.next.next = head |
| 207.课程表 | |
| 208.实现Tire树 | Tire两个成员变量Tire[]和isEnd |
| 215.数组中的第K个最大元素 | 堆、快排 |