| 1. 两数之和 |
哈希表 |
Hash的思想:将键与值匹配,实现快速查找的效果 |
170 |
Java |
| 2. 两数相加 |
链表遍历 |
~ |
445 |
Java |
| 3. 无重复字符的最长子串 |
滑动窗口、(前后)双指针 |
~ |
76 |
Java |
| 4. 寻找两个正序数组的中位数 |
二分查找 |
~ |
~ |
Java |
| 5. 最长回文子串 |
(字符串的)动态规划 |
这类动态规划题只能多练习掌握 |
10, 647 |
Java |
| 6. Z 字形变换 |
模拟 |
数学模拟,很朴素的思想 |
~ |
Java |
| 7. 整数反转 |
模拟 |
~ |
~ |
Python |
| 8. 字符串转换整数 (atoi) |
自动机 |
很难想到的一个方法,编译原理里面的 |
~ |
Java |
| 9. 回文数 |
模拟 |
~ |
~ |
Python |
| 10. 正则表达式匹配 |
(字符串的)动态规划 |
只能多练找感觉 |
44 |
Java |
| 11. 盛最多水的容器 |
双指针模拟 |
~ |
~ |
Java |
| 12. 整数转罗马数字 |
模拟 |
~ |
13 |
Java |
| 13. 罗马数字转整数 |
模拟 |
~ |
12 |
Java Python |
| 14. 最长公共前缀 |
分治,横向扫描、纵向扫描 |
掌握分治的思想 |
~ |
Python |
| 15. 三数之和 |
双指针 |
利用排序和双指针减少一次遍历 |
16, 18 |
Java Python |
| 16. 最接近的三数之和 |
双指针 |
~ |
15, 18 |
Java |
| 17. 电话号码的字母组合 |
回溯 |
回溯方法很适合遍历找到所有解 |
46 |
Java |
| 18. 四数之和 |
双指针 |
~ |
15, 16 |
Java |
| 19. 删除链表的倒数第 N 个结点 |
(前后)双指针 |
前后双指针的一个很巧妙的应用 |
~ |
Java |
| 20. 有效的括号 |
栈 |
括号匹配的一个很经典的例子,用栈来实现 |
22, 32, 224, 394 |
Java Python |
| 21. 合并两个有序链表 |
递归、迭代 |
这道题的迭代也很经典 |
23 |
Java Python |
| 22. 括号生成 |
回溯 |
~ |
20, 32 |
Java |
| 23. 合并K个升序链表 |
分治、优先队列 |
优先队列笔试挺喜欢考的 |
21 |
Java |
| 24. 两两交换链表中的节点 |
迭代、递归 |
迭代更容易想到 |
~ |
Java |
| 25. K 个一组翻转链表 |
递归 |
思路是模拟,实现用递归或者迭代 |
24, 206 |
Java |
| 26. 删除有序数组中的重复项 |
(快慢)双指针 |
~ |
27, 80 |
Java Python |
| 27. 移除元素 |
(快慢)双指针 |
~ |
26, 88 |
Java Python |
| 28. 实现 strStr() |
KMP算法 |
KMP算法是字符串匹配的经典算法,Python的find函数背后就是KMP |
~ |
Python |
| 29. 两数相除 |
二分法 |
~ |
~ |
Java |
| 31. 下一个排列 |
扫描 |
思路不太容易想,但看了题解又觉得思想很朴素 |
~ |
Java |
| 32. 最长有效括号 |
动态规划 |
好几个括号题,但是思路都不一样 |
20, 22 |
Java |
| 33. 搜索旋转排序数组 |
二分查找 |
二分查找适合有序表的查找 |
34, 35, 81 |
Java |
| 34. 在排序数组中查找元素的第一个和最后一个位置 |
二分查找 |
~ |
33, 35 |
Java |
| 35. 搜索插入位置 |
二分查找 |
一道不错的训练二分查找的题目 |
33, 34 |
Python |
| 36. 有效的数独 |
~ |
难点在于数独行与列的表示 |
37 |
Java |
| 37. 解数独 |
回溯 |
~ |
36 |
Java |
| 38. 外观数列 |
模拟 |
答案二是面向测试用例编程 |
~ |
Java |
| 39. 组合总和 |
回溯 |
~ |
~ |
Java |
| 40. 组合总和 II |
回溯 |
需要剪枝 |
78 |
Java |
| 41. 缺失的第一个正数 |
~ |
~ |
287, 442, 448 |
Java |
| 42. 接雨水 |
动态规划,双指针 |
模拟也能解决问题 |
~ |
Java |
| 43. 字符串相乘 |
~ |
字符串的加法与乘法,有时候用这种方法解决溢出问题 |
415 |
Java |
| 44. 通配符匹配 |
动态规划 |
难在*号的处理 |
10 |
Java |
| 45. 跳跃游戏 II |
贪心 |
每一步选择将来跳的远的格子 |
55 |
Java |
| 46. 全排列 |
回溯 |
~ |
17, 77, 78 |
Java Python |
| 47. 全排列 II |
回溯 |
~ |
40, 46, 60 |
Java |
| 48. 旋转图像 |
模拟 |
有技巧的模拟 |
~ |
Java |
| 49. 字母异位词分组 |
计数,Hash |
手动编写 Hash 函数的难点在于解决哈希冲突 |
1, 438, 567 |
Java |
| 50. Pow(x, n) |
快速幂算法 |
分治思想,同时了解迭代思想背后的数学原理 |
~ |
Java |
| 51. N 皇后 |
回溯 |
学会使用位运算剪枝 |
52 |
Java |
| 52. N皇后 II |
回溯 |
学会使用位运算剪枝 |
51 |
Java |
| 53. 最大子数组和 |
动态规划 |
这道题也可以利用线段树来做 |
~ |
Java Python |
| 54. 螺旋矩阵 |
模拟,DFS |
本质是遍历 |
2061 |
Java |
| 55. 跳跃游戏 |
贪心,动态规划 |
贪心时间复杂度$O(n)$,动态规划时间复杂度$O({n^2})$ |
45 |
Java |
| 56. 合并区间 |
模拟 |
贪心,排序 |
57 |
Java |
| 57. 插入区间 |
模拟 |
贪心,排序 |
56 |
Java |
| 58. 最后一个单词的长度 |
遍历 |
此题没什么难度 |
~ |
Python |
| 59. 螺旋矩阵 II |
模拟 |
~ |
54 |
Java |
| 60. 排列序列 |
回溯 |
全排列的题目 |
46, 47 |
Java |
| 61. 旋转链表 |
双指针 |
~ |
~ |
Java |
| 62. 不同路径 |
DFS,动态规划 |
DFS会超时,用动态规划 |
63, 64 |
Java |
| 63. 不同路径 II |
DFS,动态规划 |
DFS会超时,用动态规划 |
62, 64 |
Java |
| 64. 最小路径和 |
动态规划 |
~ |
62, 63 |
Java |
| 66. 加一 |
模拟 |
~ |
~ |
Python |
| 67. 二进制求和 |
位运算,模拟 |
模拟补位这个思想特挺好想的,位运算需要一定技巧,最好也掌握 |
137, 260, 421, 187, 318 |
Python |
| 68. 文本左右对齐 |
贪心 |
贪心体现在每一行的单词尽可能的多 |
~ |
Java |
| 69. x 的平方根 |
模拟 |
牛顿迭代法是一个不错的方法,C语言课堂上也是这么教的 |
~ |
Python |
| 70. 爬楼梯 |
动态规划,递归 |
经典的递归题目,直接递归重复计算太多超时 |
509 |
Python |
| 71. 简化路径 |
栈 |
先根据有效 / 拆分路径,简化问题 |
224, 394 |
Java |
| 72. 编辑距离 |
动态规划 |
挺不好理解的 |
~ |
Java |
| 73. 矩阵置零 |
模拟 |
利用数组自身的空间存储状态信息,节省空间 |
~ |
Java |
| 74. 搜索二维矩阵 |
二分查找 |
~ |
240 |
Java |
| 75. 颜色分类 |
双指针 |
用指针进行模拟更简单一些 |
~ |
Java |
| 76. 最小覆盖子串 |
滑动窗口 |
~ |
3 |
Java |
| 77. 组合 |
回溯 |
有着不同的考虑问题的思路 |
78, 216 |
Java |
| 78. 子集 |
回溯 |
和46题一样,是一道经典的回溯问题 |
46, 77 |
Java |
| 79. 单词搜索 |
DFS |
~ |
62, 63, 64, 200 |
Java |
| 80. 删除有序数组中的重复项 II |
双指针 |
~ |
26 |
Java |
| 81. 搜索旋转排序数组 II |
二分查找 |
~ |
33 |
Java |
| 82. 删除排序链表中的重复元素 II |
模拟 |
~ |
83 |
Java |
| 83. 删除排序链表中的重复元素 |
模拟 |
~ |
82 |
Java |
| 84. 柱状图中最大的矩形 |
单调栈 |
~ |
85, 1019 |
Java |
| 85. 最大矩形 |
单调栈 |
本质和84题居然相同,思路不太容易想 |
84 |
Java |
| 86. 分隔链表 |
链表 |
链表题利用虚结点可以简化问题 |
~ |
Java |
| 87. 扰乱字符串 |
动态规划 |
理解如何将问题划分为更小的子问题的,记忆化搜索DP |
~ |
Java |
| 88. 合并两个有序数组 |
双指针 |
~ |
26, 27 |
Java Python |
| 89. 格雷编码 |
回溯,位运算 |
根据生成公式也可以直接生成 |
~ |
Java |
| 90. 子集 II |
回溯 |
掌握二进制枚举这种思路 |
77, 78 |
Java |
| 91. 解码方法 |
动态规划 |
分情况讨论的状态转移 |
~ |
Java |
| 92. 反转链表 II |
递归 |
~ |
25, 206 |
Java |
| 93. 复原 IP 地址 |
回溯 |
利用IP特征,3层for循环是一个很朴素的思路 |
~ |
Java |
| 94. 二叉树的中序遍历 |
二叉树的遍历 |
二叉树的先根、中根、后根遍历本质都是DFS |
98, 101 |
Java |
| 95. 不同的二叉搜索树 II |
递归 |
树的问题,优先选择递归 |
~ |
Java |
| 96. 不同的二叉搜索树 |
动态规划,卡塔兰数 |
题目本质为知道中根遍历的结果,一共有多少种可能的二叉树。卡塔兰数的应用 |
~ |
Java |
| 98. 验证二叉搜索树 |
中根遍历 |
二叉搜索树的中根遍历结果是递增的 |
94, 99 |
Java |
| 99. 恢复二叉搜索树 |
中根遍历 |
找出交换的位置 |
94, 98 |
Java |
| 100. 相同的树 |
递归 |
也可以遍历 |
~ |
Java |
| 101. 对称二叉树 |
二叉树的遍历 |
二叉树遍历的主要方法:直接递归、用栈模拟递归 |
94, 98 |
Java |
| 102. 二叉树的层序遍历 |
二叉树的层次遍历 |
层次遍历的本质是BFS |
103, 107 |
Java |
| 103. 二叉树的锯齿形层序遍历 |
二叉树的层次遍历 |
~ |
102, 107 |
Java |
| 104. 二叉树的最大深度 |
递归,DFS,BFS |
还是喜欢递归的思路 |
111, 257 |
Java |
| 105. 从前序与中序遍历序列构造二叉树 |
利用先根遍历和中根遍历 |
配上Hash可以省去查找的时间 |
106, 1008, 1028 |
Java |
| 106. 从中序与后序遍历序列构造二叉树 |
掌握后根遍历和中根遍历 |
~ |
105, 1008, 1028 |
Java |
| 107. 二叉树的层序遍历 II |
二叉树的层次遍历 |
~ |
102, 107 |
Java |
| 108. 将有序数组转换为二叉搜索树 |
递归 |
高度平衡二叉搜索树 |
109 |
Java |
| 109. 有序链表转换二叉搜索树 |
递归 |
高度平衡二叉搜索树,快速找链表的中间结点 |
108, 876 |
ava |
| 110. 平衡二叉树 |
递归 |
本质上确定树高 |
104, 111 |
Java |
| 111. 二叉树的最小深度 |
递归 |
可以采用DFS遍历并实时更新最短路径 |
104, 257 |
Java |
| 113. 路径总和 II |
DFS |
树的遍历,递归思路 |
~ |
Java |
| 114. 二叉树展开为链表 |
先根遍历 |
这道题的思路有很多,个人还是喜欢递归,毕竟树的问题,一般都用递归解决 |
~ |
Java |
| 115. 不同的子序列 |
动态规划 |
双串的动态规划 |
~ |
Java |
| 116. 填充每个节点的下一个右侧节点指针 |
树的层次遍历 |
~ |
102 |
Java |
| 117. 填充每个节点的下一个右侧节点指针 II |
树的遍历 |
层次遍历 |
~ |
Java |
| 118. 杨辉三角 |
模拟 |
根据规律计算出来即可 |
119 |
Java |
| 119. 杨辉三角 II |
模拟 |
倒着计算更新时不影响值的计算 |
118 |
Java |
| 120. 三角形最小路径和 |
动态规划 |
经典的动态规划题,可以从上往下,也可以从下往上 |
~ |
Java |
| 121. 买卖股票的最佳时机 |
~ |
本质是动态规划 |
53, 122, 309 |
Java |
| 122. 买卖股票的最佳时机 II |
动态规划,贪心 |
多状态动态规划 |
309, 714 |
Java |
| 123. 买卖股票的最佳时机 III |
动态规划 |
通解是利用多状态动态规划,也可以分为2部分,每部分都用121. 买卖股票的最佳时机的方法 |
121, 122, 309 |
Java |
| 124. 二叉树中的最大路径和 |
递归 |
这道题比较巧妙的地方在于每次递归的返回值和我们最终的结果有联系,但是不是同一个东西 |
~ |
Java |
| 125. 验证回文串 |
双指针 |
掌握转换大小写字符的API |
151, 680 |
Java |
| 128. 最长连续序列 |
Hash,并查集 |
查找型问题,利用Hash可以降低时间复杂度 |
1 |
Java |
| 129. 求根节点到叶节点数字之和 |
树的遍历 |
DFS, BFS |
~ |
Java |
| 130. 被围绕的区域 |
DFS,BFS,并查集 |
本质是岛屿类问题,经典的DFS问题 |
695, 1020 |
Java |
| 131. 分割回文串 |
回溯 |
~ |
~ |
Java |
| 132. 分割回文串 II |
动态规划 |
~ |
131 |
Java |
| 133. 克隆图 |
图的遍历 |
考察了图的表示以及遍历 |
~ |
Java |
| 134. 加油站 |
贪心 |
本质还是模拟 |
~ |
Java |
| 135. 分发糖果 |
贪心 |
在满足要求的情况下,每个孩子分到的糖果尽可能少 |
~ |
Java |
| 136. 只出现一次的数字 |
位运算 |
异或运算满足交换律和结合律,异或运算也是一种常见的哈希函数 |
49 |
Java |
| 137. 只出现一次的数字 II |
位运算 |
从位运算的角度思考题目 |
136 |
Java |
| 139. 单词拆分 |
动态规划 |
看到题目就会想到用动态规划来实现,不过状态转移方程不太好想 |
~ |
Java |
| 141. 环形链表 |
(快慢)双指针 |
这道题也可以当成查找已经访问的结点,用Hash做 |
26, 27, 88 |
Java |
| 142. 环形链表 II |
(快慢)双指针 |
此处有重要的数学结论:环内相遇点到入环点的距离等于起点到入环点的距离 |
141, 287 |
Java |
| 143. 重排链表 |
~ |
一道链表的综合题,解题思路较多 |
206, 876 |
Java |
| 144. 二叉树的前序遍历 |
遍历 |
二叉树的遍历 |
94, 145 |
Java |
| 145. 二叉树的后序遍历 |
遍历 |
二叉树的遍历 |
94, 144 |
Java |
| 146. LRU 缓存 |
Hash,链表 |
要求查找和更新操作都要常数时间复杂度。因此需要兼具Hash和链表的特征 |
460 |
Java |
| 148. 排序链表 |
归并排序 |
时间复杂度$O({n\log_2n})$ |
~ |
Java |
| 150. 逆波兰表达式求值 |
栈 |
逆波兰表达式 |
~ |
Java |
| 151. 颠倒字符串中的单词 |
双指针 |
熟悉字符串的相关API |
125 |
Java |
| 152. 乘积最大子数组 |
动态规划 |
一下子维护了两个dp数组 |
53 |
Java |
| 155. 最小栈 |
辅助栈 |
官方题解是通过辅助栈来实现一个最小栈的结构,额外空间复杂度大,而且有点取巧的感觉,建议用所给代码解法解决,空间复杂度为常数 |
~ |
Java |
| 157. 用 Read4 读取 N 个字符 |
模拟 |
理解题意,模拟即可 |
~ |
Java |
| 159. 至多包含两个不同字符的最长子串 |
滑动窗口 |
~ |
340 |
Java |
| 160. 相交链表 |
Hash,数学 |
这道题的数学没见过类似题型的话,不太好想 |
~ |
Java |
| 161. 相隔为 1 的编辑距离 |
模拟 |
分类讨论解决问题 |
~ |
Java |
| 162. 寻找峰值 |
二分查找 |
本质是二分查找,不过需要讨论的情况多了点 |
~ |
Java |
| 163. 缺失的区间 |
遍历数组 |
模拟,注意边界即可 |
~ |
Java |
| 165. 比较版本号 |
双指针 |
题目不难,主要考察了字符串表示的数比大小 |
415 |
Java |
| 167. 两数之和 II - 输入有序数组 |
二分查找,双指针 |
双指针更利用了有序数组的性质 |
15, 18 |
Java |
| 168. Excel表列名称 |
模拟 |
10进制与26进制的转换,注意细节就好 |
~ |
Java |
| 169. 多数元素 |
哈希表,Boyer-Moore 投票算法 |
~ |
~ |
Java |
| 170. 两数之和 III - 数据结构设计 |
Hash |
~ |
1 |
Java |
| 179. 最大数 |
排序 |
字符串比较 |
~ |
Java |
| 186. 翻转字符串里的单词 II |
双指针 |
~ |
151 |
Java |
| 188. 买卖股票的最佳时机 IV |
动态规划 |
~ |
123 |
Java |
| 189. 轮转数组 |
双指针 |
掌握环状方法以及数组翻转的方法 |
~ |
Java |
| 190. 颠倒二进制位 |
位运算、分治 |
熟悉位运算 |
Java |
|
| 191. 位1的个数 |
位运算 |
~ |
~ |
Java |
| 198. 打家劫舍 |
动态规划 |
利用滚动数组可以降低空间复杂度 |
~ |
Java |
| 199. 二叉树的右视图 |
二叉树的遍历 |
DFS遍历需要记录最大层数,BFS遍历需要判断是不是最右边的结点 |
~ |
Java |
| 200. 岛屿数量 |
DFS,BFS,并查集 |
岛屿类问题 |
130, 694, 695 |
Java |
| 202. 快乐数 |
Hash,(快慢)双指针 |
掌握Hash和快慢双指针的思想。找规律也能很快做出来,甚至可以直接利用计算10次之后看结果是否为1进行判断 |
~ |
Java |
| 203. 移除链表元素 |
链表遍历 |
注意考虑特殊情况 |
~ |
Java |
| 206. 反转链表 |
递归、迭代 |
~ |
~ |
Java |
| 207. 课程表 |
拓扑排序 |
图的相关知识,必须要会 |
210, 802 |
Java |
| 208. 实现 Trie (前缀树) |
前缀树 |
学习前缀树这个模型,可能会对其他字符串类型的题提供解决思路 |
~ |
Java |
| 209. 长度最小的子数组 |
前缀和,滑动窗口 |
经典的滑动窗口的题目 |
219 |
Java |
| 210. 课程表 II |
拓扑排序 |
掌握正向的拓扑排序和逆向的拓扑排序 |
207, 802 |
Java |
| 213. 打家劫舍 II |
动态规划 |
分为两种情况讨论 |
198 |
Java |
| 215. 数组中的第K个最大元素 |
选择排序 |
快速排序、堆排序 |
~ |
Java |
| 216. 组合总和 III |
回溯 |
剪枝进一步优化时间 |
77 |
Java |
| 217. 存在重复元素 |
哈希表 |
此题进一步优化,只要哈希表中存在当前值即可返回真 |
~ |
Java |
| 219. 存在重复元素 II |
滑动窗口,哈希表 |
利用哈希表存储下标最大值也是一个好方法 |
209 |
Java |
| 221. 最大正方形 |
动态规划 |
重点还是找到状态以及建立状态转移方程 |
1277 |
Java |
| 224. 基本计算器 |
栈 |
用栈模拟括号匹配 |
20, 227, 394 |
Java |
| 225. 用队列实现栈 |
栈,队列 |
思考如何用一个队列实现 |
232 |
Java |
| 226. 翻转二叉树 |
递归 |
遇到二叉树最先想到的就应该是递归 |
101 |
Java Python |
| 227. 基本计算器 II |
栈 |
用栈模拟运算符的优先级 |
224 |
Java |
| 228. 汇总区间 |
模拟 |
数组 |
~ |
Java |
| 230. 二叉搜索树中第K小的元素 |
二叉搜索树 |
中根遍历 |
~ |
Java |
| 231. 2 的幂 |
位运算 |
二进制数的性质 |
~ |
Java |
| 232. 用栈实现队列 |
队列,栈 |
~ |
225 |
Java |
| 234. 回文链表 |
递归、快慢指针 |
这道题的递归方法可以更好的了解递归的作用机理 |
206 |
Java |
| 235. 二叉搜索树的最近公共祖先 |
树的遍历 |
二叉搜索树的性质 |
~ |
Java |
| 236. 二叉树的最近公共祖先 |
递归、哈希 |
对于有一一对应关系的数据存在,就应该想到哈希表 |
~ |
Java |
| 237. 删除链表中的节点 |
链表 |
理解题意,根据基本的链表操作即可 |
~ |
Java |
| 238. 除自身以外数组的乘积 |
左右乘积列表 |
学习一下这个思想 |
~ |
Java |
| 239. 滑动窗口最大值 |
优先队列 |
~ |
253 |
Java |
| 240. 搜索二维矩阵 II |
二分查找、Z 字形查找 |
Z 字形查找比二分查找更充分的利用矩阵的特点 |
74 |
Java |
| 246. 中心对称数 |
双指针 |
注意特殊情况处理 |
~ |
Java |
| 250. 统计同值子树 |
动态规划,DFS |
树形的动态规划 |
298, 549, 687 |
Java |
| 252. 会议室 |
快速优先排序 |
快排是时间复杂度较低的排序算法 |
253 |
Java |
| 253. 会议室 II |
优先队列 |
Java中PriorityQueue是利用二叉堆实现的优先队列 |
~ |
Java |
| 256. 粉刷房子 |
动态规划 |
多状态动态规划 |
265 |
Java |
| 257. 二叉树的所有路径 |
回溯 |
树的深度优先遍历 |
104, 111 |
Java |
| 261. 以图判树 |
并查集 |
图与树的区别在于树中的任意两个节点至多只有一条路径 |
~ |
Java |
| 265. 粉刷房子 II |
动态规划 |
~ |
256 |
Java |
| 266. 回文排列 |
模拟 |
哈希表 |
~ |
Java |
| 267. 回文排列 II |
回溯 |
运用剪枝来处理重复的情况 |
47 |
Java |
| 269. 火星词典 |
图,拓扑排序 |
难点在于如何构建图 |
~ |
Java |
| 270. 最接近的二叉搜索树值 |
二叉树 |
树的遍历,二叉搜索树的性质 |
~ |
Java |
| 277. 搜寻名人 |
图的应用 |
邻接矩阵,入度,出度 |
~ |
Java |
| 278. 第一个错误的版本 |
二分查找 |
~ |
~ |
Java |
| 279. 完全平方数 |
动态规划 |
这题属于完全背包问题 |
322,2212 |
Java Python |
| 280. 摆动排序 |
排序 |
数学找规律 |
~ |
Java |
| 283. 移动零 |
双指针 |
此题有简易解法 |
27 |
Java |
| 286. 墙与门 |
图 |
多源最短路径问题,BFS |
1162 |
Java |
| 287. 寻找重复数 |
二分查找,快慢指针 |
二分查找主要是问题的转化,知道自己需要找什么;快慢指针难点在于将数组转化为链表结构 |
142 |
Java |
| 292. Nim 游戏 |
模拟 |
找规律 |
~ |
Java |
| 295. 数据流的中位数 |
堆 |
大根堆与小根堆的典型应用 |
~ |
Java |
| 297. 二叉树的序列化与反序列化 |
二叉树的遍历 |
序列化与反序列化的关键在于空结点的存储 |
1028 |
Java |
| 298. 二叉树最长连续序列 |
动态规划,DFS |
树形的动态规划 |
337, 549 |
Java |
| 300. 最长递增子序列 |
动态规划,贪心 |
~ |
435 |
Java |
| 301. 删除无效的括号 |
DFS, BFS |
此题使用DFS难在问题的建模 |
20, 22 |
Java |
| 305. 岛屿数量 II |
并查集 |
确定连通分量的数量是并查集的典型应用 |
547 |
Java |
| 306. 累加数 |
回溯 |
难在问题的转化以及处理数据溢出 |
2 |
Java |
| 309. 最佳买卖股票时机含冷冻期 |
动态规划 |
这道题的状态也需要好好构思一下 |
121, 122, 123, 188, 714 |
Java |
| 312. 戳气球 |
动态规划 |
题目难点在于状态的建立和转移 |
~ |
Java Python |
| 314. 二叉树的垂直遍历 |
层次遍历 |
~ |
~ |
Java |
| 317. 离建筑物最近的距离 |
图的遍历 |
BFS |
~ |
Java |
| 319. 灯泡开关 |
数学 |
自己试几次也能发现规律 |
~ |
Java |
| 322. 零钱兑换 |
动态规划 |
完全背包问题 |
279 |
Java |
| 323. 无向图中连通分量的数目 |
DFS |
图的表示与遍历 |
207, 547 |
Java |
| 337. 打家劫舍 III |
动态规划 |
树类型的动态规划和后序遍历结合起来用 |
298 |
Java |
| 338. 比特位计数 |
动态规划 |
~ |
~ |
Java |
| 340. 至多包含 K 个不同字符的最长子串 |
滑动窗口,哈希表 |
利用数组实现哈希表的功能 |
159, 438 |
Java |
| 343. 整数拆分 |
动态规划 |
利用数学方法分析可以进一步降低时间复杂度 |
~ |
Java |
| 344. 反转字符串 |
双指针 |
双指针的简单应用 |
917 |
Java |
| 345. 反转字符串中的元音字母 |
双指针 |
结合哈希表判断 |
~ |
Java |
| 346. 数据流中的移动平均值 |
模拟 |
队列 |
~ |
Java |
| 347. 前 K 个高频元素 |
优先队列 |
要求时间复杂度优于$O({n\log_2n})$,不能简单进行sort() |
253 |
Java |
| 349. 两个数组的交集 |
哈希,双指针 |
利用哈希表进行空间换时间 |
350 |
Java |
| 350. 两个数组的交集 II |
哈希,双指针 |
~ |
349 |
Java |
| 351. 安卓系统手势解锁 |
回溯 |
回溯的本质就是穷举 |
~ |
Java |
| 354. 俄罗斯套娃信封问题 |
动态规划 |
本质是LIS问题 |
300, 673, 406 |
Java |
| 357. 统计各位数字都不同的数字个数 |
排列组合 |
这是一道数学问题 |
~ |
Java |
| 366. 寻找二叉树的叶子节点 |
树的遍历 |
先根遍历就是自上而下删除叶子结点,后根遍历就是自下而上判断子树的高度 |
~ |
Java |
| 368. 最大整除子集 |
动态规划 |
先排序,简化问题 |
~ |
Java |
| 369. 给单链表加一 |
链表 |
数学 |
~ |
Java |
| 370. 区间加法 |
差分数组 |
利用前缀和的思想,需要借鉴和掌握 |
~ |
Java |
| 376. 摆动序列 |
贪心,动态规划 |
动态规划选择不同的状态,时间复杂度也不同 |
~ |
Java |
| 380. O(1) 时间插入、删除和获取随机元素 |
集合 |
熟悉Java集合的常见操作 |
~ |
Java |
| 382. 链表随机节点 |
水塘抽样 |
在未知链表长度时就用水塘抽样,当随机取得一个数的操作较多时,应用空间换时间 |
~ |
Java |
| 383. 赎金信 |
计数 |
哈希 |
~ |
Java |
| 392. 判断子序列 |
贪心,双指针 |
贪心的思想体现在每次选择左边匹配的字符 |
~ |
Java |
| 394. 字符串解码 |
栈 |
括号匹配的问题 |
20, 224 |
Java |
| 399. 除法求值 |
带权并查集 |
带权并查集需要在查找及合并时更新权值 |
~ |
Java |
| 400. 第 N 位数字 |
数学模拟,二分查找 |
本利用先验知识确定边界解决溢出 |
~ |
Java |
| 402. 移掉 K 位数字 |
贪心 |
每次删除较大的数 |
~ |
Java |
| 403. 青蛙过河 |
动态规划 |
~ |
~ |
Java |
| 406. 根据身高重建队列 |
排序 |
难点在于问题的转化 |
354 |
Java |
| 410. 分割数组的最大值 |
动态规划 |
拆分连续数组的题目 |
813 |
Java |
| 413. 等差数列划分 |
动态规划 |
由于要求连续子数组,使得状态转移简单一些 |
~ |
Java |
| 415. 字符串相加 |
~ |
加法的一个技巧,对于溢出的情况很有用 |
43 |
Java |
| 416. 分割等和子集 |
动态规划 |
0-1背包问题 |
494, 1230 |
Java |
| 417. 太平洋大西洋水流问题 |
回溯 |
本题通过反向搜索降低时间复杂度 |
~ |
Java |
| 422. 有效的单词方块 |
模拟 |
字符串遍历 |
~ |
Java |
| 423. 从英文中重建数字 |
模拟 |
找到规律,利用哈希表实现 |
~ |
Java |
| 424. 替换后的最长重复字符 |
滑动窗口 |
如果一个问题暂时没有思路,可以先考虑暴力解法 |
~ |
Java |
| 435. 无重叠区间 |
贪心,动态规划 |
~ |
300 |
Java |
| 437. 路径总和 III |
前缀和 |
利用树的递归遍历是一个首选思路 |
560 |
Java |
| 438. 找到字符串中所有字母异位词 |
滑动窗口 |
~ |
49, 567 |
Java |
| 439. 三元表达式解析器 |
栈 |
确定出入栈时机 |
~ |
Java |
| 445. 两数相加 II |
链表,栈 |
逆序处理优先考虑栈 |
2 |
Java |
| 448. 找到所有数组中消失的数字 |
~ |
~ |
155 |
Java |
| 449. 序列化和反序列化二叉搜索树 |
递归 |
二叉搜索树的性质,先根遍历、后根遍历都可以 |
536 |
Java |
| 452. 用最少数量的箭引爆气球 |
贪心 |
此题排序时候注意溢出 |
~ |
Java |
| 455. 分发饼干 |
贪心 |
贪心的入门题 |
~ |
Java |
| 460. LFU 缓存 |
双向链表 |
~ |
146 |
Java |
| 461. 汉明距离 |
位运算 |
题目本质就是统计一个数的二进制表示其中 1 的数目 |
338 |
Java |
| 473. 火柴拼正方形 |
回溯 |
~ |
~ |
Java |
| 484. 寻找排列 |
栈 |
转化为栈问题 |
~ |
Java |
| 485. 最大连续 1 的个数 |
模拟 |
一次遍历即可 |
~ |
Java |
| 487. 最大连续1的个数 II |
滑动窗口 |
~ |
424, 1004 |
Java |
| 489. 扫地机器人 |
回溯 |
难点在于确定回溯时机,易错点在于需要自己实现回溯动作 |
2061 |
Java |
| 490. 迷宫 |
图的遍历 |
DFS,BFS |
~ |
Java |
| 491. 递增子序列 |
回溯 |
难点在于剪枝的处理 |
40 |
Java |
| 494. 目标和 |
动态规划 |
0-1背包问题 |
416, 1230 |
Java |
| 499. 迷宫 III |
图的加权最短路径 |
Dijkstra算法 |
~ |
Java |
| 505. 迷宫 II |
Dijkstra算法 |
需要将问题转化为有权图 |
~ |
Java |
| 509. 斐波那契数 |
动态规划,递归 |
记忆化递归解决了递归重复计算的问题 |
70 |
Java |
| 518. 零钱兑换 II |
动态规划 |
完全背包问题 |
~ |
Java |
| 529. 扫雷游戏 |
回溯 |
本质是岛屿类问题,特殊之处在于一次有8个方向可以遍历 |
~ |
Java |
| 536. 从字符串生成二叉树 |
递归 |
树的遍历 |
~ |
Java |
| 538. 把二叉搜索树转换为累加树 |
中根遍历 |
转化问题,就很好解决 |
94 |
Java |
| 540. 有序数组中的单一元素 |
二分查找 |
先通过分析确定待查找下标的性质,从而确定如何二分查找 |
~ |
Java |
| 541. 反转字符串 II |
双指针 |
~ |
344, 917 |
Java |
| 542. 01 矩阵 |
BFS |
本质是最短路径问题 |
~ |
Java |
| 543. 二叉树的直径 |
DFS |
~ |
1522 |
Java |
| 545. 二叉树的边界 |
树 |
树的遍历 |
~ |
Java |
| 547. 省份数量 |
DFS,并查集 |
题目本质就是确定图的连通分量的数量 |
323 |
Java |
| 549. 二叉树中最长的连续序列 |
动态规划,DFS |
树形的动态规划 |
298, 337 |
Java |
| 557. 反转字符串中的单词 III |
双指针 |
~ |
344, 541 |
Java |
| 560. 和为 K 的子数组 |
前缀和 |
~ |
437 |
Java |
| 561. 数组拆分 I |
贪心,排序 |
贪心在于每次选择的数尽可能接近 |
~ |
Java |
| 567. 字符串的排列 |
异位词,滑动窗口 |
利用计数的方法处理异位词 |
49, 438 |
Java |
| 572. 另一棵树的子树 |
树的遍历,哈希 |
树的序列化 |
652 |
Java |
| 581. 最短无序连续子数组 |
插入排序,双指针 |
无序数组中的最小值和最大值应该在的位置之间的长度即为答案 |
~ |
Java |
| 582. 杀掉进程 |
图 |
图的遍历 |
~ |
Java |
| 583. 两个字符串的删除操作 |
动态规划 |
本质是最长公共子序列,也可以利用编辑距离来做 |
72, 1143 |
Java |
| 589. N 叉树的前序遍历 |
树的前序遍历 |
掌握利用栈实现的思想 |
144 |
Java |
| 590. N 叉树的后序遍历 |
树的后序遍历 |
掌握利用栈实现的思想 |
145 |
Java |
| 605. 种花问题 |
贪心 |
让两朵花之间的距离尽可能小 |
~ |
Java |
| 611. 有效三角形的个数 |
二分查找 |
利用双指针可以优化时间复杂度 |
~ |
Java |
| 617. 合并二叉树 |
递归 |
~ |
226 |
Java |
| 621. 任务调度器 |
模拟 |
~ |
~ |
Java |
| 624. 数组列表中的最大距离 |
贪心 |
找到最值 |
~ |
Java |
| 630. 课程表 III |
贪心 |
难点在于贪心规则的确定 |
~ |
Java |
| 633. 平方数之和 |
双指针 |
注意越界 |
~ |
Java |
| 643. 子数组最大平均数 I |
滑动窗口 |
每一次求和时,利用滑动窗口,更新降低时间复杂度 |
1252 |
Java |
| 646. 最长数对链 |
贪心 |
抓住问题本质 |
~ |
Java |
| 647. 回文子串 |
中心扩展法 |
Manacher 算法不要求掌握 |
5 |
Java |
| 652. 寻找重复的子树 |
二叉树的遍历 |
要想唯一确定二叉树,就需要序列化 |
572 |
Java |
| 667. 优美的排列 II |
数学 |
~ |
~ |
Java |
| 669. 修剪二叉搜索树 |
树的遍历 |
二叉搜索树的性质 |
~ |
Java |
| 672. 灯泡开关 Ⅱ |
位运算 |
本质是穷举 |
~ |
Java |
| 673. 最长递增子序列的个数 |
动态规划 |
一下子维护两个dp数组 |
~ |
Java |
| 674. 最长连续递增序列 |
贪心,双指针 |
贪心体现在以某一个元素开头的子序列尽可能长 |
~ |
Java |
| 679. 24 点游戏 |
回溯 |
这道题可以更好的理解回溯 |
~ |
Java |
| 680. 验证回文字符串 Ⅱ |
双指针 |
~ |
125 |
Java |
| 684. 冗余连接 |
并查集 |
DFS也可以做 |
685 |
Java |
| 685. 冗余连接 II |
并查集 |
灵活的运用并查集,体会并查集的作用是连接同一类型的节点 |
684 |
Java |
| 687. 最长同值路径 |
动态规划,DFS |
树形的动态规划 |
250, 298, 549 |
Java |
| 694. 不同岛屿的数量 |
DFS |
本质是岛屿类问题 |
200 |
Java |
| 695. 岛屿的最大面积 |
回溯 |
本质是岛屿类问题,经典的DFS问题 |
130, 200 |
Java |
| 698. 划分为k个相等的子集 |
回溯 |
~ |
473 |
Java |
| 704. 二分查找 |
二分查找 |
必须会写 |
~ |
Java |
| 705. 设计哈希集合 |
链表,哈希 |
哈希冲突的处理 |
~ |
Java |
| 707. 设计链表 |
链表 |
熟悉链表的性质以及操作 |
~ |
Java |
| 708. 循环有序列表的插入 |
链表 |
循环链表的处理 |
~ |
Java |
| 712. 两个字符串的最小ASCII删除和 |
动态规划 |
双串问题的动态规划 |
72 |
Java |
| 714. 买卖股票的最佳时机含手续费 |
动态规划 |
具有两个状态的动态规划 |
122 |
Java |
| 718. 最长重复子数组 |
动态规划,滑动窗口 |
双串问题可以考虑动态规划 |
~ |
Java |
| 720. 词典中最长的单词 |
哈希 |
涉及字符串字典序的比较,也可用字典树实现 |
208 |
Java |
| 722. 删除注释 |
模拟 |
字符串遍历 |
~ |
Java |
| 738. 单调递增的数字 |
贪心 |
在满足要求时让每一位的数字尽可能大 |
~ |
Java |
| 739. 每日温度 |
单调栈 |
如果需要找到左边或者右边第一个比当前位置的数大或者小,则可以考虑使用单调栈 |
84, 85 |
Java |
| 740. 删除并获得点数 |
动态规划 |
问题的转化 |
198 |
Java |
| 746. 使用最小花费爬楼梯 |
动态规划 |
~ |
~ |
Java |
| 760. 找出变位映射 |
哈希表 |
遍历 |
~ |
Java |
| 763. 划分字母区间 |
贪心,哈希表 |
贪心每次所能到达的最远距离 |
~ |
Java |
| 765. 情侣牵手 |
并查集 |
确定并查集的连通分量数量比确定并查集内每一个连通分量的大小更容易 |
547 |
Java |
| 771. 宝石与石头 |
哈希表 |
本质是字符统计 |
~ |
Java |
| 772. 基本计算器 III |
栈 |
逆波兰表达式 |
224, 227 |
Java |
| 778. 水位上升的泳池中游泳 |
并查集,Dijkstra 算法 |
单源最短路径问题 |
1102 |
Java |
| 780. 到达终点 |
模拟 |
数学分析优化时间复杂度 |
~ |
Java |
| 784. 字母大小写全排列 |
回溯 |
~ |
~ |
Java |
| 785. 判断二分图 |
DFS,并查集 |
~ |
802, 886 |
Java |
| 788. 旋转数字 |
模拟 |
数位 DP的思想 |
~ |
Java |
| 796. 旋转字符串 |
~ |
本质是查找子串的题 |
28 |
Java |
| 801. 使序列递增的最小交换次数 |
动态规划 |
状态转移不太好想 |
~ |
Java |
| 802. 找到最终的安全状态 |
DFS,拓扑排序 |
标准的深度优先遍历 |
207, 210, 785 |
Java |
| 803. 打砖块 |
并查集 |
并查集只能合并,不能拆分,此题是并查集的反向应用 |
~ |
Java |
| 804. 唯一摩尔斯密码词 |
哈希表 |
Java中直接利用数组实现 hash 比HashMap速度快一点点 |
1 |
Java |
| 806. 写字符串需要的行数 |
模拟 |
~ |
~ |
Java |
| 811. 子域名访问计数 |
模拟 |
熟悉String类的API |
~ |
Java |
| 813. 最大平均值和的分组 |
动态规划 |
理解状态如何转移 |
410 |
Java |
| 817. 链表组件 |
模拟 |
哈希表 |
~ |
Java |
| 822. 翻转卡片游戏 |
哈希表 |
找规律题 |
~ |
Java |
| 823. 带因子的二叉树 |
动态规划 |
子节点到根的递推 |
~ |
Java |
| 827. 最大人工岛 |
并查集 |
这道题更考查了对并查集的理解 |
~ |
Java |
| 828. 统计子串中的唯一字符 |
哈希表 |
有点记忆化搜索的感觉 |
~ |
Java |
| 831. 隐藏个人信息 |
模拟 |
字符串 |
~ |
Java |
| 833. 字符串中的查找与替换 |
模拟 |
自定义排序规则并排序 |
~ |
Java |
| 834. 树中距离之和 |
树,图 |
无向联通树中,每个节点都可以是根节点,邻接表表示法,动态规划 |
~ |
Java |
| 849. 到最近的人的最大距离 |
贪心 |
应用规律 |
~ |
Java |
| 852. 山脉数组的峰顶索引 |
二分查找 |
二分查找的简单应用 |
~ |
Java |
| 856. 括号的分数 |
栈 |
栈类型的题目,不一定要将原元素出入站,模拟栈的实现即可 |
224 |
Java |
| 860. 柠檬水找零 |
贪心 |
本题贪心的是让5元的纸币数量尽可能多 |
~ |
Java |
| 861. 翻转矩阵后的得分 |
贪心 |
就行而言,1的位置尽可能靠左;就列而言,1的数量尽可能多 |
~ |
Java |
| 865. 具有所有最深节点的最小子树 |
递归 |
树的前序遍历、后序遍历 |
~ |
Java |
| 873. 最长的斐波那契子序列的长度 |
动态规划,哈希 |
~ |
300 |
Java |
| 874. 模拟行走机器人 |
模拟 |
难点在于二维矩阵中点的表示 |
~ |
Java |
| 876. 链表的中间结点 |
(快慢)双指针 |
~ |
26, 27, 141, 142, 287 |
Java |
| 886. 可能的二分法 |
DFS,并查集 |
深度优先遍历,但遍历时需要记录其它信息 |
785 |
Java |
| 887. 鸡蛋掉落 |
动态规划 |
思考方式很奇特的动态规划 |
~ |
Java |
| 904. 水果成篮 |
滑动窗口 |
滑动窗口的经典问题 |
~ |
567 |
| 915. 分割数组 |
模拟 |
模拟实现 |
~ |
Java |
| 917. 仅仅反转字母 |
双指针 |
~ |
344 |
Java |
| 918. 环形子数组的最大和 |
动态规划 |
难在环形数组的处理,将环形数组分为两部分处理 |
53 |
Java |
| 921. 使括号有效的最少添加 |
贪心 |
贪心体现在对于每一个出现的右括号,前面必须保证有左括号与其匹配 |
~ |
Java |
| 931. 下降路径最小和 |
动态规划 |
矩阵型的动态规划 |
~ |
Java |
| 940. 不同的子序列 II |
动态规划 |
时间复杂度优化 |
~ |
Java |
| 947. 移除最多的同行或同列石头 |
并查集 |
合并次数即为最终结果 |
~ |
Java |
| 959. 由斜杠划分区域 |
并查集 |
难在如何将问题建模 |
~ |
Java |
| 970. 强整数 |
哈希表 |
枚举 |
~ |
Java |
| 975. 奇偶跳 |
动态规划,单调栈 |
就状态转移而言,这道题不难,难点在于利用单调栈简化表示 |
84, 85 |
Java |
| 977. 有序数组的平方 |
双指针 |
练习双指针的一道不错的题目 |
~ |
Java |
| 978. 最长湍流子数组 |
滑动窗口 |
注意相等的时候左右边界同时移动 |
~ |
Java |
| 979. 在二叉树中分配硬币 |
回溯 |
这道题需要对树的回溯、遍历有更深的理解 |
~ |
Java |
| 980. 不同路径 III |
回溯 |
本质是二维矩阵遍历题型 |
~ |
Java |
| 990. 等式方程的可满足性 |
并查集 |
本质是确定图的连通分量 |
547 |
Java |
| 995. K 连续位的最小翻转次数 |
差分数组 |
~ |
155 |
Java |
| 1003. 检查替换后的词是否有效 |
模拟 |
栈 |
~ |
Java |
| 1004. 最大连续1的个数 III |
滑动窗口 |
~ |
487 |
Java |
| 1008. 前序遍历构造二叉搜索树 |
递归 |
构建二叉树的题目 |
105, 106, 1028 |
Java |
| 1010. 总持续时间可被 60 整除的歌曲 |
哈希表 |
计数 |
~ |
Java |
| 1015. 可被 K 整除的最小整数 |
哈希表 |
数学 |
~ |
Java |
| 1016. 子串能表示从 1 到 N 数字的二进制串 |
字符串处理 |
KMP算法 |
~ |
Java |
| 1017. 负二进制转换 |
进制转换 |
模拟题 |
~ |
Java |
| 1019. 链表中的下一个更大节点 |
单调栈 |
单调递增栈 |
84 |
Java |
| 1020. 飞地的数量 |
DFS,BFS,并查集 |
本质是岛屿类问题,经典的DFS问题 |
130, 695 |
Java |
| 1027. 最长等差数列 |
动态规划 |
~ |
873 |
Java |
| 1028. 从先序遍历还原二叉树 |
根据遍历结果还原二叉树 |
~ |
105, 106, 297, 1008 |
Java |
| 1029. 两地调度 |
贪心 |
贪心体现在尽可能让去B市费用与去A市费用相差越大的人去A市,剩下的去B市 |
~ |
Java |
| 1033. 移动石子直到连续 |
贪心 |
~ |
~ |
Java |
| 1034. 边界着色 |
回溯 |
本质是岛屿类问题 |
130, 200, 1020 |
Java |
| 1039. 多边形三角剖分的最低得分 |
动态规划 |
记忆化搜索之前出现的状态 |
~ |
Java |
| 1040. 移动石子直到连续 II |
模拟 |
找规律 |
~ |
Java |
| 1041. 困于环中的机器人 |
模拟 |
字符串处理 |
2061 |
Java |
| 1042. 不邻接植花 |
图 |
图的颜色表示法 |
~ |
Java |
| 1052. 爱生气的书店老板 |
滑动窗口 |
~ |
643 |
Java |
| 1053. 交换一次的先前排列 |
贪心 |
多写几个确定贪心原理 |
~ |
Java |
| 1055. 形成字符串的最短路径 |
贪心,动态规划 |
贪心模拟简单且快捷 |
~ |
Java |
| 1056. 易混淆数 |
模拟 |
哈希表 |
~ |
Java |
| 1059. 从始点到终点的所有路径 |
图 |
反向拓扑排序 |
802 |
Java |
| 1060. 有序数组中的缺失元素 |
二分查找 |
~ |
1228 |
Java |
| 1072. 按列翻转得到最大值等行数 |
哈希表 |
位运算 |
~ |
Java |
| 1073. 负二进制数相加 |
模拟 |
本质仍是二进制运算 |
~ |
Java |
| 1079. 活字印刷 |
回溯 |
本质是树结构 |
~ |
Java |
| 1080. 根到叶路径上的不足节点 |
树的遍历 |
找到递归关系 |
~ |
Java |
| 1086. 前五科的均分 |
模拟 |
堆 |
1172 |
Java |
| 1090. 受标签影响的最大值 |
贪心 |
根据题意确定排序规则并进行排序 |
~ |
Java |
| 1091. 二进制矩阵中的最短路径 |
BFS |
本质是最短路径问题 |
~ |
Java |
| 1093. 大样本统计 |
模拟 |
基本数据类型转换 |
~ |
Java |
| 1102. 得分最高的路径 |
并查集 |
并查集的巧妙运用 |
778 |
Java |
| 1120. 子树的最大平均值 |
树 |
树的遍历 |
~ |
Java |
| 1133. 最大唯一数 |
模拟 |
哈希表,遍历 |
~ |
Java |
| 1135. 最低成本联通所有城市 |
并查集 |
并查集的巧妙运用 |
~ |
Java |
| 1136. 平行课程 |
拓扑排序 |
运用了关键活动算法中求每一个事件的最早开始时间 |
207, 210, 802 |
Java |
| 1138. 字母板上的路径 |
哈希,矩阵 |
用矩阵实现哈希 |
~ |
Java |
| 1143. 最长公共子序列 |
动态规划 |
经典的双串动态规划 |
~ |
Java |
| 1145. 二叉树着色游戏 |
二叉树遍历、贪心 |
遍历 |
~ |
Java |
| 1150. 检查一个数是否在数组中占绝大多数 |
查找算法 |
二分查找 |
~ |
Java |
| 1162. 地图分析 |
BFS |
多源最短路径 |
2204 |
Java |
| 1172. 餐盘栈 |
模拟 |
堆 |
1086 |
Java |
| 1197. 进击的骑士 |
图的无权最短路径 |
Dijkstra算法 |
~ |
Java |
| 1202. 交换字符串中的元素 |
并查集 |
此题可以学习如何利用哈希表保存并查集内不同的连通分量 |
765 |
Java |
| 1208. 尽可能使字符串相等 |
滑动窗口 |
~ |
~ |
Java |
| 1210. 穿过迷宫的最少移动次数 |
BFS |
BFS用来求解最短路径 |
~ |
Java |
| 1217. 玩筹码 |
贪心 |
贪心的思想体现在尽可能多的移动偶数次 |
~ |
Java |
| 1222. 可以攻击国王的皇后 |
模拟 |
枚举 |
~ |
Java |
| 1228. 等差数列中缺失的数字 |
二分查找 |
~ |
1060 |
Java |
| 1229. 安排会议日程 |
双指针 |
对不同情况进行讨论确定指针如何移动 |
~ |
Java |
| 1230. 抛掷硬币 |
动态规划 |
0-1背包问题 |
416, 494 |
Java |
| 1234. 替换子串得到平衡字符串 |
双指针 |
字符统计、滑动窗口 |
~ |
Java |
| 1236. 网络爬虫 |
图的遍历 |
需要将问题抽象化 |
~ |
Java |
| 1237. 找出给定方程的正整数解 |
双指针 |
~ |
15 |
Java |
| 1247. 交换字符使得字符串相同 |
贪心 |
此题需要确定3类基本的字符串形式,贪心在于尽量让一次交换使得两个位置由不同变为相同 |
~ |
Java |
| 1250. 检查「好数组」 |
辗转相除法 |
最大公约数 |
~ |
Java |
| 1254. 统计封闭岛屿的数目 |
回溯 |
岛屿问题的进阶,需要一些判断条件 |
200, 1020 |
Java |
| 1265. 逆序打印不可变链表 |
链表 |
栈,递归 |
~ |
Java |
| 1267. 统计参与通信的服务器 |
模拟 |
哈希表,矩阵遍历 |
~ |
Java |
| 1281. 整数的各位积和之差 |
模拟 |
确定数位值 |
~ |
Java |
| 1289. 下降路径最小和 II |
动态规划 |
学习如何优化空间 |
~ |
Java |
| 1306. 跳跃游戏 III |
BFS |
一道简单的广度优先搜索题 |
~ |
Java |
| 1319. 连通网络的操作次数 |
并查集 |
实质还是确定连通分量的数量 |
547 |
Java |
| 1332. 删除回文子序列 |
双指针 |
~ |
125 |
Java |
| 1333. 餐厅过滤器 |
模拟 |
排序 |
~ |
Java |
| 1372. 二叉树中的最长交错路径 |
动态规划,DFS |
树形的动态规划 |
~ |
Java |
| 1373. 二叉搜索子树的最大键值和 |
树的遍历 |
后根遍历传递子树状态到当前节点 |
~ |
Java |
| 1376. 通知所有员工所需的时间 |
树 |
树的遍历与表示 |
~ |
Java |
| 1388. 3n 块披萨 |
动态规划 |
~ |
213 |
Java |
| 1400. 构造 K 个回文字符串 |
贪心 |
此题贪心在于让奇数个字符分配到不同的回文串中 |
~ |
Java |
| 1419. 数青蛙 |
模拟 |
字符串计数 |
~ |
Java |
| 1423. 可获得的最大点数 |
滑动窗口 |
反向思考问题更简单 |
~ |
Java |
| 1426. 数元素 |
哈希表 |
数组遍历 |
~ |
Java |
| 1427. 字符串的左右移 |
模拟 |
字符串处理 |
~ |
Java |
| 1429. 第一个唯一数字 |
模拟 |
队列,LinkedHashSet |
~ |
Java |
| 1444. 切披萨的方案数 |
动态规划 |
矩阵型的动态规划用左上角的点坐标表示矩阵 |
~ |
Java |
| 1441. 用栈操作构建数组 |
模拟 |
栈 |
~ |
Java |
| 1448. 统计二叉树中好节点的数目 |
树的遍历 |
DFS |
~ |
Java |
| 1456. 定长子串中元音的最大数目 |
滑动窗口 |
~ |
1052 |
Java |
| 1462. 课程表 IV |
图 |
拓扑排序,额外处理结点关系 |
~ |
Java |
| 1473. 粉刷房子 III |
动态规划 |
多状态动态规划 |
~ |
Java |
| 1474. 删除链表 M 个节点之后的 N 个节点 |
链表遍历 |
~ |
~ |
Java |
| 1475. 商品折扣后的最终价格 |
单调栈 |
需要找到第一个比当前位置小的值 |
739 |
Java |
| 1478. 安排邮筒 |
动态规划 |
多维状态,同时需要进行数学分析 |
~ |
Java |
| 1487. 保证文件名唯一 |
哈希表 |
哈希计数 |
~ |
Java |
| 1490. 克隆 N 叉树 |
树的遍历 |
DFS,BFS |
~ |
Java |
| 1493. 删掉一个元素以后全为 1 的最长子数组 |
滑动窗口 |
~ |
487 |
Java |
| 1506. 找到 N 叉树的根节点 |
树的遍历 |
图的入度,遍历 |
~ |
Java |
| 1522. N 叉树的直径 |
树的遍历 |
确定树的高度 |
543 |
Java |
| 1523. 在区间范围内统计奇数数目 |
数学,前缀和 |
前缀和的方法本质也是数学 |
~ |
Java |
| 1572. 矩阵对角线元素的和 |
模拟 |
矩阵数组 |
~ |
Java |
| 1582. 二进制矩阵中的特殊位置 |
模拟 |
~ |
~ |
Java |
| 1590. 使数组和能被 P 整除 |
哈希表,前缀和 |
思想是两数之和的哈希思想 |
~ |
Java |
| 1592. 重新排列单词间的空格 |
模拟 |
数学模拟,注意特殊情况 |
~ |
Java |
| 1593. 拆分字符串使唯一子字符串的数目最大 |
回溯 |
~ |
~ |
Java |
| 1598. 文件夹操作日志搜集器 |
模拟 |
利用栈解决问题 |
~ |
Java |
| 1599. 经营摩天轮的最大利润 |
模拟 |
纯数组模拟 |
~ |
Java |
| 1601. 最多可达成的换楼请求数目 |
回溯 |
本质是二进制枚举 |
~ |
Java |
| 1603. 设计停车系统 |
模拟 |
很简单的一道题 |
~ |
Java |
| 1604. 警告一小时内使用相同员工卡大于等于三次的人 |
字符串处理,Java集合 |
模拟 |
~ |
Java |
| 1605. 给定行和列的和求可行矩阵 |
贪心 |
贪心体现在生成矩阵某一个位置的值的时候,让这个值尽可能大 |
~ |
Java |
| 1608. 特殊数组的特征值 |
二分查找 |
二分查找的巧用 |
~ |
Java |
| 1619. 删除某些元素后的数组均值 |
模拟,排序 |
排序加快解题 |
~ |
Java |
| 1624. 两个相同字符之间的最长子字符串 |
哈希表 |
模拟,遍历统计 |
~ |
Java |
| 1631. 最小体力消耗路径 |
并查集 |
连通性问题就可以考虑使用并查集 |
1102 |
Java |
| 1640. 能否连接形成数组 |
哈希表 |
找到题目中数字顺序的关键点 |
~ |
Java |
| 1652. 拆炸弹 |
滑动窗口 |
利用滑动窗口避免重复计算 |
~ |
Java |
| 1654. 到家的最少跳跃次数 |
BFS |
无限图需要确定图的边界(上下限) |
~ |
Java |
| 1658. 将 x 减到 0 的最小操作数 |
滑动窗口 |
同时处理前缀和及后缀和会降低时间复杂度 |
~ |
Java |
| 1663. 具有给定数值的最小字符串 |
贪心 |
贪心模拟 |
~ |
Java |
| 1664. 生成平衡数组的方案数 |
前缀和,动态规划 |
动态规划 |
~ |
Java |
| 1669. 合并两个链表 |
链表遍历 |
模拟 |
~ |
Java |
| 1694. 重新格式化电话号码 |
模拟 |
字符串模拟 |
~ |
Java |
| 1695. 删除子数组的最大得分 |
滑动窗口 |
配合哈希表处理右滑边界 |
~ |
Java |
| 1700. 无法吃午餐的学生数量 |
模拟 |
栈、队列 |
~ |
Java |
| 1710. 卡车上的最大单元数 |
贪心,排序 |
贪心体现在优先选择大箱子 |
~ |
Java |
| 1749. 任意子数组和的绝对值的最大值 |
动态规划 |
分两种情况进行处理 |
53 |
Java |
| 1753. 移除石子的最大得分 |
贪心 |
优先队列模拟 |
2335 |
Java |
| 1768. 交替合并字符串 |
模拟 |
双指针 |
~ |
Java |
| 1784. 检查二进制字符串字段 |
模拟 |
理清思路,表示出所有的状态即可 |
~ |
Java |
| 1790. 仅执行一次字符串交换能否使两个字符串相等 |
哈希 |
字符统计 |
~ |
Java |
| 1796. 字符串中第二大的数字 |
哈希 |
哈希表 |
~ |
Java |
| 1797. 设计一个验证系统 |
哈希表,LRU |
LRU的应用 |
~ |
Java |
| 1798. 你能构造出连续值的最大数目 |
贪心 |
本题难点在于递推关系的确定 |
~ |
Java |
| 1800. 最大升序子数组和 |
动态规划 |
经典的动态规划题 |
53 |
Java |
| 1801. 积压订单中的订单总数 |
模拟 |
优先队列模拟 |
~ |
Java |
| 1805. 字符串中不同整数的数目 |
模拟 |
双指针 |
~ |
Java |
| 1807. 替换字符串中的括号内容 |
哈希表 |
模拟 |
~ |
Java |
| 1814. 统计一个数组中好对子的数目 |
哈希表 |
利用哈希表降低时间复杂度 |
1 |
Java |
| 1817. 查找用户活跃分钟数 |
哈希表 |
模拟 |
~ |
Java |
| 1828. 统计一个圆中点的数目 |
数组遍历 |
模拟 |
~ |
Java |
| 1905. 统计子岛屿 |
并查集 |
~ |
~ |
Java |
| 1911. 最大子序列交替和 |
动态规划 |
~ |
122 |
Java |
| 1921. 消灭怪物的最大数量 |
贪心 |
排序 |
~ |
Java |
| 1971. 寻找图中是否存在路径 |
图 |
图的表示,图的遍历 |
~ |
Java |
| 1984. 学生分数的最小差值 |
滑动窗口 |
本题将题目转化后就会好做很多 |
~ |
Java |
| 1993. 树上的操作 |
树 |
树的表示,树的遍历 |
~ |
Java |
| 2042. 检查句子中的数字是否递增 |
模拟 |
~ |
1805 |
Java |
| 2044. 统计按位或能得到最大值的子集数目 |
回溯 |
二进制枚举,这道题只需要求结果,不需要保留所有可能的排列 |
~ |
Java |
| 2061. 扫地机器人清扫过的空间个数 |
模拟,DFS |
本题难点在于确定遍历终止 |
54, 489 |
Java |
| 2050. 并行课程 III |
图 |
拓扑排序 |
~ |
Java |
| 2177. 找到和为给定整数的三个连续整数 |
模拟 |
数学 |
~ |
Java |
| 2178. 拆分成最多数目的正偶数之和 |
贪心 |
贪心在于每次选择的偶数尽可能小 |
~ |
Java |
| 2180. 统计各位数字之和为偶数的整数个数 |
模拟 |
数学推算找规律更快 |
~ |
Java |
| 2185. 统计包含给定前缀的字符串 |
模拟 |
字符串模拟 |
~ |
Java |
| 2204. 到无向图中环的距离 |
拓扑排序,多源最短路径 |
图论题目的综合应用 |
~ |
Java |
| 2208. 将数组和减半的最少操作次数 |
贪心 |
配合优先队列 |
~ |
Java |
| 2235. 两整数相加 |
模拟 |
数学 |
~ |
Java |
| 2236. 判断根结点是否等于子结点之和 |
模拟 |
二叉树的基础概念 |
~ |
Java |
| 2240. 买钢笔和铅笔的方案数 |
枚举 |
数学 |
~ |
Java |
| 2283. 判断一个数的数字计数是否等于数位的值 |
数学模拟 |
~ |
~ |
Java |
| 2287. 重排字符形成目标字符串 |
哈希表 |
模拟,字符串计数 |
~ |
Java |
| 2293. 极大极小游戏 |
递归 |
理解题意,模拟 |
~ |
Java |
| 2299. 强密码检验器 II |
哈希表 |
模拟 |
~ |
Java |
| 2303. 计算应缴税款总额 |
模拟 |
分类讨论 |
~ |
Java |
| 2309. 兼具大小写的最好英文字母 |
哈希 |
字符串统计 |
~ |
Java |
| 2315. 统计星号 |
模拟 |
~ |
~ |
Java |
| 2319. 判断矩阵是否是一个 X 矩阵 |
数组 |
模拟 |
~ |
Java |
| 2325. 解密消息 |
字符串 |
模拟 |
~ |
Java |
| 2331. 计算布尔二叉树的值 |
树的遍历 |
后根遍历的思想 |
~ |
Java |
| 2335. 装满杯子需要的最短总时长 |
贪心 |
贪心模拟,优先队列 |
1753 |
Java |
| 2337. 移动片段得到字符串 |
字符串 |
基于双指针确定规则 |
777 |
Java |
| 2341. 数组能形成多少数对 |
哈希表 |
字符统计 |
~ |
Java |
| 2347. 最好的扑克手牌 |
哈希表 |
字符统计 |
~ |
Java |
| 2351. 第一个出现两次的字母 |
哈希表,位运算 |
只有两种状态的时候就可以考虑位运算 |
~ |
Java |
| 2357. 使数组中所有元素都等于零 |
哈希表,优先队列 |
哈希计数,模拟 |
~ |
Java |
| 2363. 合并相似的物品 |
哈希表 |
哈希表,排序 |
~ |
Java |
| 2373. 矩阵中的局部最大值 |
模拟 |
有点最大池化层的感觉,高维情况下可以用单调队列实现 |
~ |
Java |
| 2379. 得到 K 个黑块的最少涂色次数 |
滑动窗口 |
双指针模拟定长滑动窗口 |
~ |
Java |
| 2383. 赢得比赛需要的最少训练时长 |
模拟,贪心 |
注意特殊情况 |
~ |
Java |
| 2384. 最大回文数字 |
贪心 |
注意特殊情况的判断 |
~ |
Java |
| 2399. 检查相同字母间的距离 |
哈希表 |
字符串处理 |
~ |
Java |
| 2404. 出现最频繁的偶数元素 |
模拟 |
数学 |
~ |
Java |
| 2423. 删除字符使频率相同 |
哈希表 |
分类讨论易出错 |
~ |
Java |
| 2432. 处理用时最长的那个任务的员工 |
模拟 |
数组处理 |
~ |
Java |
| 2441. 与对应负数同时存在的最大正整数 |
哈希表 |
数组哈希遍历 |
~ |
Java |
| 2446. 判断两个事件是否存在冲突 |
排序 |
字符串比较 |
~ |
Java |
| 2475. 数组中不等三元组的数目 |
模拟 |
哈希表 |
~ |
Java |
| 2500. 删除每行中的最大值 |
模拟 |
排序 |
~ |
Java |
| 2511. 最多可以摧毁的敌人城堡数目 |
模拟 |
遍历 |
~ |
Java |
| 2517. 礼盒的最大甜蜜度 |
二分查找 |
捋清二分查找的终止条件 |
~ |
Java |
| 2544. 交替数字和 |
模拟 |
符号变量的使用 |
~ |
Java |
| 2559. 统计范围内的元音字符串数 |
字符串 |
哈希表,前缀和 |
~ |
Java |
| 2560. 打家劫舍 IV |
二分查找 |
有序数组问题就可以尝试二分查找 |
~ |
Java |
| 2582. 递枕头 |
数学 |
模拟 |
~ |
Java |
| 2591. 将钱分给最多的儿童 |
贪心 |
每次让尽可能多的人分到8元钱 |
~ |
Java |
| 2596. 检查骑士巡视方案 |
图的遍历 |
DFS |
~ |
Java |
| 2603. 收集树中金币 |
图的应用 |
拓扑排序 |
~ |
Java |
| 2605. 从两个数字数组里生成最小数字 |
模拟 |
哈希表 |
~ |
Java |
| 2651. 计算列车到站时间 |
模拟 |
数学 |
~ |
Java |
| 2679. 矩阵中的和 |
模拟 |
堆排序、优先队列 |
~ |
Java |
| 2681. 英雄的力量 |
动态规划 |
学习用动态规划来表示子集 |
~ |
Java |
| 2682. 找出转圈游戏输家 |
模拟 |
数组处理 |
~ |
Java |
| 2842. 统计一个字符串的 k 子序列美丽值最大的数目 |
DFS |
穷举所有可能出现的结果 |
~ |
Java |
| 2849. 判断能否在给定时间到达单元格 |
模拟 |
数学 |
~ |
Java |
| 2856. 删除数对后的最小数组长度 |
贪心 |
堆,优先队列 |
~ |
Java |