刷leetcode hot 100以前需要了解一些基础知识:
- 常见排序:冒泡排序,插入排序,选择排序,归并排序,快速排序,堆排序。 时间复杂度为O(nlogn):归并排序和堆排序。快速排序时间复杂度最好的情况下是O(nlogn),最坏的情况下是O(n^2)。
- 字符串的常用方法:length(),substring(),spilt()。 StringBuffer()的常用方法:deleteCharAt(),reverse(),toString(),append(),insert。
- 常用数据结构及其常用方法:List,HashMap,HashSet,PriorityQueue,stack,queue。
- Arrays.sort()自定义排序,PriorityQueue()自定义排序。
| 数据结构 | 常用方法 |
|---|---|
| List | add(),remove() |
| HashMap | put(),size(),remove(),containsKey() |
| HashSet | add(),remove(),size(),contains() |
| PriorityQueue | poll(),offer(),isEmpty(),size(),peek() |
| stack | push(),size(),pop(),isEmpty(),peek() |
| queue | poll(),offer(),isEmpty(),size(),peek() |
-
dp数组和下标的含义,递推公式,初始化,遍历顺序。
-
01背包和完全背包。
| 题号 | 题目 | 题解 |
|---|---|---|
| 198 | 打家劫舍 | Java |
| 238 | 除自身数组以外的乘积 | Java |
| 221 | 最大正方形 | Java |
| 152 | 乘积最大子数组 | Java |
| 139 | 单词拆分 | Java |
| 647 | 回文子串 | Java |
| 322 | 零钱兑换 | Java |
| 494 | 目标和 | Java |
| 416 | 分割等和子集 | Java |
| 337 | 打家劫舍 III | Java |
| 312 | 戳气球 | Java |
| 309 | 买卖股票的最佳时期含冷冻期 | Java |
| 300 | 最长递增子序列 | Java |
| 279 | 完全平方数 | Java |
| 42 | 接雨水 | Java |
| 32 | 最长有效括号 | Java |
| 10 | 正则表达式匹配 | Java |
| 5 | 最长回文子串 | Java |
| 96 | 不同的二叉搜索树 | Java |
| 85 | 最大矩形 | Java |
| 72 | 编辑距离 | Java |
| 70 | 爬楼梯 | Java |
| 62 | 不同路径 | Java |
| 53 | 最大子数组和 | Java |
- 链表的题目往往使用虚拟头结点的方法,以避免对头结点为空的情况进行特判。
- 做链表的题目是,我们需要记住的是链表的增删节点都是使用的双指针。
| 题号 | 题目 | 题解 |
|---|---|---|
| 160 | 相交链表 | Java |
| 234 | 回文链表 | Java |
| 206 | 反转链表 | Java |
| 148 | 排序链表 | Java |
| 146 | LRU 缓存 | Java |
| 142 | 环形链表 II | Java |
| 141 | 环形链表 | Java |
| 23 | 合并 K 个升序链表 | Java |
| 21 | 合并两个有序链表 | Java |
| 114 | 二叉树展开为链表 | Java |
| 19 | 删除链表的倒数第 N 个结点 | Java |
| 2 | 两数相加 | Java |
- 单调栈按照从栈底到栈顶的大小变化可以分为单调递增栈和单调递减栈。
- 单调栈中存储的是元素的索引。
| 题号 | 题目 | 题解 |
|---|---|---|
| 739 | 每日温度 | Java |
| 84 | 柱状图中最大的矩形 | Java |
- 构建特殊数据结构。
| 题号 | 题目 | 题解 |
|---|---|---|
| 207 | 课程表 | Java |
| 399 | 除法求值 | Java |
| 208 | 实现 Trie (前缀树) | Java |
- ^异或:任何数^自身 = 0,^0不变。
- &1:判断末尾数是否为1。
- <<:向左位移1位,>>:向右位移1位。
| 题号 | 题目 | 题解 |
|---|---|---|
| 461 | 汉明距离 | Java |
| 338 | 比特位计数 | Java |
- 通过局部最优,得到全局最优,需要会自定义排序,建议使用lamda表达式。
| 题号 | 题目 | 题解 |
|---|---|---|
| 406 | 根据身高重建队列 | Java |
| 253 | 会议室II | Java |
| 621 | 任务调度器 | Java |
- PriorityQueue是底层是堆排序。
| 题目 | 题号 | 题解 |
|---|---|---|
| 239 | 滑动窗口最大值 | Java |
| 23 | 合并 K 个升序链表 | Java |
- 回溯三要素:1.传递的参数和返回类型;2.终止条件;3.回溯的逻辑。
| 题号 | 题目 | 题解 |
|---|---|---|
| 22 | 括号生成 | Java |
| 46 | 全排列 | Java |
| 17 | 电话号码的字母组合 | Java |
| 78 | 子集 | Java |
| 39 | 组合总和 | Java |
- 需要会二分法的使用和双指针、滑动窗口。
| 题号 | 题目 | 题解 |
|---|---|---|
| 48 | 旋转图像 | Java |
| 33 | 搜索旋转排序数组 | Java |
| 34 | 在排序数组中查找元素的第一个和最后一个位置 | Java |
| 31 | 下一个排列 | Java |
| 15 | 三数之和 | Java |
| 11 | 盛最多水的容器 | Java |
| 4 | 寻找两个正序数组的中位数 | Java |
| 1 | 两数之和 | Java |
| 75 | 颜色分类 | Java |
| 56 | 合并区间 | Java |
| 55 | 跳跃游戏 | Java |
| 215 | 数组中的第K个最大元素 | Java |
| 287 | 寻找重复数 | Java |
| 283 | 移动零 | Java |
| 240 | 搜索二维矩阵 II | Java |
- 需要会前中后序遍历的递归、迭代实现和层序遍历。
| 题号 | 题目 | 题解 |
|---|---|---|
| 236 | 二叉树的最近公共祖先 | Java |
| 226 | 翻转二叉树 | Java |
| 124 | 二叉树中的最大路径和 | Java |
| 297 | 二叉树的序列化与反序列化 | Java |
| 543 | 二叉树的直径 | Java |
| 538 | 把二叉搜索树转换为累加树 | Java |
| 114 | 二叉树展开为链表 | Java |
| 617 | 合并二叉树 | Java |
| 105 | 从前序与中序遍历序列构造二叉树 | Java |
| 104 | 二叉树的最大深度 | Java |
| 102 | 二叉树的层序遍历 | Java |
| 101 | 对称二叉树 | Java |
| 98 | 验证二叉搜索树 | Java |
| 96 | 不同的二叉搜索树 | Java |
| 437 | 路径总和 III | Java |
| 94 | 二叉树的中序遍历 | Java |
- Stack、Queue、HashMap和HashSet的常见方法需要会使用。
| 题号 | 题目 | 题解 |
|---|---|---|
| 169 | 多数元素 | Java |
| 128 | 最长连续序列 | Java |
| 438 | 找到字符串中所有字母异位词 | Java |
| 394 | 字符串解码 | Java |
| 560 | 和为 K 的子数组 | Java |
| 20 | 有效的括号 | Java |
| 3 | 无重复字符的最长子串 | Java |
-
深度优先搜索:按照既定的搜索顺序,在一个方向搜索到头之后,回溯搜索下一个方向。
-
广度优先搜索:从起始位置开始,逐层遍历(按照距离)所有可能到达的位置。
| 题号 | 题目 | 题解 |
|---|---|---|
| 79 | 单词搜索 | Java |
| 200 | 岛屿数量 | Java |