递归,迭代

递归(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)

前缀和

2574. 左右元素和的差值 - 力扣(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)

贪心

贪心算法是一种在每一步选择中都采取当前最优决策,期望通过局部最优的累积达到全局最优的算法策略。

300. 最长递增子序列 - 力扣(LeetCode)

历史

Todo:

105. 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode)(用迭代实现)

二、针对性刷题推荐

2. BFS/DFS

  • 核心题目

  • 127. 单词接龙(双向BFS优化)

推荐理由:覆盖树、图、网格三大场景

3. 贪心算法

  • 进阶训练

  • 452. 用最少数量的箭引爆气球(区间重叠问题)

  • 135. 分发糖果(双向遍历)

  • 134. 加油站(环形数组贪心)

推荐理由:强化区间操作与环形问题处理能力

4. 动态规划变种

  • 高阶题型

  • 312. 戳气球(区间DP+分治思想)

推荐理由:突破线性DP思维局限

5. 滑动窗口优化

推荐理由:掌握多条件窗口收缩与数据结构结合