学习链接
CS-Note
labuladong的算法小抄
Krahets图解算法数据结构
力扣加加
公众号:帅地玩编程、程序员小灰(漫画算法)、代码随想录
一、BFS系列
111. 二叉树的最小深度(入门级)
官方题解(while里面没写for循环遍历一层中每个节点)
我的提交,写了for循环遍历一层中的每个节点
1091. 二进制矩阵中的最短路径
542. 01矩阵(?多源BFS)
二、DFS系列
200. 岛屿数量
岛屿类问题通用解法
题解都挺好看的
Java、JS、Python三种代码
695. 岛屿的最大面积
三、回溯法系列
17. 电话号码的字母组合
四、数组系列
88. 合并两个有序数组
167. 两数之和2(有序数组)
利用双指针求解。
一张图告诉你 O(n) 的双指针解法的本质原理
五、链表系列
21. 合并两个有序链表
83. 删除排序链表中的重复元素
206. 反转链表
六、树系列
104. 二叉树的最大深度(入门级)
七、DP系列(一种求个数,一种求最优)
- 一维数组
70. 爬楼梯(其实就是斐波那契数列)
# 空间复杂度O(1)
class Solution:
def climbStairs(self, n: int) -> int:
if n <= 2:
return n
a = 1
b = 2
for i in range(3, n+1):
sum_ = a + b
a = b
b = sum_
return sum_
509. 斐波那契数列
class Solution:
def fib(self, N: int) -> int:
a, b = 0, 1
for i in range(N):
a, b = b, a + b
return a
区别在于,跳楼梯的dp[2] = 2,斐波那契数列的dp[2] = 1
- 二维数组
62. 不同路径(思路和斐波那契一样,只不过变成了二维)
63. 不同路径2(网格中存在障碍,可以看作该点的路径数为0)
64. 最小路径和(也可以用BFS做?)
- 子序列问题
300. 最长上升子序列(经典!)
常规动态规划解法(labuladong),还有一种二分法(正常人想不到,略过)
Python版题解
八、贪心算法
455. 分发饼干
435. 无重叠区间(或:最多有几个互不相交的区间)
贪心算法(labuladong)
动态规划算法(最长上升子序列等一系列相关问题)