递归,迭代
递归(Recursion):函数调用自身 迭代(Iteration):通过循环结构重复执行代码块
排序算法
详见:[[排序算法]]
搜索算法
二分查找
33. 搜索旋转排序数组 中等,二分查找变体
深度优先搜索(DFS)
递归实现:
def dfs_recursive(graph, start):
visited = set()
def dfs(node):
if node in visited:
return
visited.add(node)
print(node) # 处理节点
for neighbor in graph[node]:
dfs(neighbor)
dfs(start)
return visited
用栈实现:
def dfs_iterative(graph, start):
visited = set()
stack = [start]
while stack:
node = stack.pop() # 弹出栈顶
if node not in visited:
visited.add(node)
print(node) # 处理节点
# 将未访问的邻居压栈(注意:倒序压栈保证遍历顺序与递归一致)
for neighbor in reversed(graph[node]):
if neighbor not in visited:
stack.append(neighbor)
return visited
329. 矩阵中的最长递增路径 - 力扣(LeetCode)
广度优先搜索(BFS)
通常用一个队列实现,先进先出。
指针相关
快慢指针
1. 用于找到链表的中点
找到链表的中点,以中点为分界,将链表拆分成两个子链表。寻找链表的中点可以使用快慢指针的做法,快指针每次移动 2 步,慢指针每次移动 1 步,当快指针到达链表末尾时,慢指针指向的链表节点即为链表的中点。 148. 排序链表 - 力扣(LeetCode)
双指针
19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode) 11. 盛最多水的容器 - 力扣(LeetCode)
栈相关
单调栈
42. 接雨水 - 力扣(LeetCode) 1475. 商品折扣后的最终价格 - 力扣(LeetCode)
前缀和
图相关
Dijkstra
3286. 穿越网格图的安全路径 - 力扣(LeetCode)
递归
回溯
回溯(Backtracking)本质上是一种暴力搜索的"聪明版"——通过递归遍历所有可能的解,并在发现当前路径不可能通向正确答案时,及时剪枝(撤销选择),避免无效搜索。
51. N 皇后 - 力扣(LeetCode) 131. 分割回文串 - 力扣(LeetCode) 动态规划+回溯
动态规划
线段树
树状数组
树状数组(Binary Indexed Tree)
数组下标 i 管辖的区间长度 = lowbit(i),即 i & -i。
i 的二进制: 管辖长度 lowbit(i): 管辖的区间:
1 (0001) 1 [1, 1]
2 (0010) 2 [1, 2]
3 (0011) 1 [3, 3]
4 (0100) 4 [1, 4]
5 (0101) 1 [5, 5]
6 (0110) 2 [5, 6]
7 (0111) 1 [7, 7]
8 (1000) 8 [1, 8]
规律:tree[i] 保存的是 sum(arr[i - lowbit(i) + 1 .. i])
class BIT:
def __init__(self, n):
self.n = n
self.tree = [0] * (n + 1)
# !!注意!! 下标从 1 开始
# 因为lowbit(i) = i & -i, 而 0 的 lowbit 是 0,导致add(0, delta) 会死循环
def add(self, i, delta):
# 在位置 i 增加 delta
while i <= self.n:
self.tree[i] += delta
i += i & -i # 最低位的 1
def query(self, i):
# 查询前缀和 [1, i]
res = 0
while i > 0:
res += self.tree[i]
i -= i & -i # 最低位的 1
return res
def range_query(self, l, r):
# 区间查询 [l, r]
return self.query(r) - self.query(l - 1)
315. 计算右侧小于当前元素的个数 - 力扣(LeetCode)
倍增
类似二进制分解,先尝试大步长,再尝试小步长。如果 2^i 步会过头,那就尝试 2^(i-1) 步,直到找到恰好能跳的最大步长。 ![[Pasted image 20260710201130.png]] 3534. 针对图的路径存在性查询 II - 力扣(LeetCode)
贪心
贪心算法是一种在每一步选择中都采取当前最优决策,期望通过局部最优的累积达到全局最优的算法策略。
历史
Todo:
105. 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode)(用迭代实现)
二、针对性刷题推荐
2. BFS/DFS
-
核心题目
-
127. 单词接龙(双向BFS优化)
推荐理由:覆盖树、图、网格三大场景
3. 贪心算法
-
进阶训练
-
452. 用最少数量的箭引爆气球(区间重叠问题)
-
135. 分发糖果(双向遍历)
-
134. 加油站(环形数组贪心)
推荐理由:强化区间操作与环形问题处理能力
4. 动态规划变种
-
高阶题型
-
312. 戳气球(区间DP+分治思想)
推荐理由:突破线性DP思维局限
5. 滑动窗口优化
-
复杂场景
-
76. 最小覆盖子串(哈希计数+条件校验) 76. 最小覆盖子串 - 力扣(LeetCode)
-
239. 滑动窗口最大值(单调队列)
推荐理由:掌握多条件窗口收缩与数据结构结合