16. 最接近的三数之和
中等题,很好理解,还是固定一个i,然后双指针处理
1 | class Solution { |
33. 搜索旋转排序数组
中等题,经典二分,要么左半部分是有序的,要么右半部分是有序的
1 | class Solution { |
43. 字符串相乘
中等题,这题出的没啥意义,不点评了
1 | class Solution { |
46. 全排列
中等题,全排列是很重要的,本题里数组元素都不同才转化为集合来做,如果有重复元素用数组做也可以
1 | class Solution { |
53. 最大子数组和
中等题,动态规划,简单来说就是用数组来记录到每一位的最大连续子数组和
1 | class Solution { |
54. 螺旋矩阵
中等题,四条边不断向内压缩,注意方向和临界条件即可
1 | class Solution { |
59. 螺旋矩阵 II
中等题,跟上题差不多,由取数变成了填数
1 | class Solution { |
61. 旋转链表
中等题,简单来说就是遍历链表拿到尾结点和长度,有了长度就能拿到应该截断的位置,然后截断再接上
1 | /** |
62. 不同路径
中等题,简单的动态规划,计算出每个格子的路径数,注意两条边的路径数都是1
1 | class Solution { |
78. 子集
中等题,每多一个数,相当于在当前的子集中插入一个数,再加上此数自身
1 | class Solution { |
89. 格雷编码
中等题,简单理解就是前加1,再镜像,镜像的再前加1。用递归解决
1 | class Solution { |
122. 买卖股票的最佳时机 II
中等题,这道题很简单,不要想复杂喽。想象一下股神的操作,每涨必持有,每跌必不在场
1 | class Solution { |
142. 环形链表 II
中等题,这题需要数学推导。构建两轮快慢指针的相遇,第一次相遇后,快指针重新指向头节点,然后快指针速率降到一步,再次相遇点就是环入口。
1 | /** |
146. LRU 缓存
中等题,本题是可以用数组来做的,但是数组的移动、删除不是O(1),而双向链表可以做到,所以才用双向链表来做。我也验证了两种方法,发现双向链表确实比数组快了很多。
1 | class LRUCache { |
148. 排序链表
中等题,用递归排序
1 | /** |
155. 最小栈
中等题,用辅助栈处理最小元素问题
1 | class MinStack { |
215. 数组中的第K个最大元素
中等题,生成随机数,然后用快排处理
1 | class Solution { |
230. 二叉搜索树中第K小的元素
中等题,两种方法,一种是把值都存到数组里,排序数组再取值。第二种是遍历途中记录数量,达到k返回,注意添加节点的顺序是先左再自己然后右。
1 | /** |
235. 二叉搜索树的最近公共祖先
中等题,要么都在左边,要么都在右边,除此之外就返回当前节点
1 | /** |
236. 二叉树的最近公共祖先
中等题,递归到p或q或空为止,左右都有返回当前节点,否则左边有返回左边、右边有返回右边,都没有返回空。返回空和右边有的情况合并了。
1 | /** |
237. 删除链表中的节点
中等题,注意题中说node不是末尾节点
1 | /** |
238. 除自身以外数组的乘积
中等题,对角线是1,正反遍历两遍,把两边的元素都乘上
1 | class Solution { |
4. 寻找两个正序数组的中位数
困难题,先合并再取中位数
1 | class Solution { |
23. 合并 K 个升序链表
困难题,用分治方法,合并两个,将结果再和另一个合并
1 | /** |
124. 二叉树中的最大路径和
困难题,路径和是左子链值+右子链值+当前节点值。注意如果左或右子链和为负数,负贡献的链路直接丢弃不要。如果左右子链和都是负数,就相当于只返回当前节点值,题目说了路径可以仅包含一个节点。
1 | /** |