总结与进阶

从「为什么要学」到「怎么用」。 本课程从开篇的意义与复杂度起步,历经数组、链表、栈与队列、哈希表、树与二叉树、BST 与平衡树、堆与优先队列、图与遍历、图算法、排序、查找与二分、递归与分治、动态规划、贪心算法,把数据结构与算法的主线串了一遍。本章对全书做回顾,提炼知识地图与核心思想,并给出后续学习方向与三道综合练习题(Python3 + 类型标注与注释),方便你按需复习与进阶。

一、全书知识地图

按模块可概括为:基础结构(数组、链表、栈、队列、哈希表)→ 树与图(二叉树、BST/AVL/红黑、堆、图与 DFS/BFS、最短路与 MST)→ 排序与查找(比较排序、二分及其变体)→ 算法思想(递归与分治、动态规划、贪心)。复杂度(大 O)贯穿始终,是衡量「选哪种结构、哪种算法」的标尺。

全书主线:基础结构 → 树图堆 → 排序查找 → 递归/DP/贪心

二、核心思想小结

复杂度:用大 O 描述时间、空间随规模增长的趋势;选数据结构与算法时先看「需要什么操作、允许什么复杂度」。数据结构选型:查多用哈希、有序用 BST/堆、邻接关系用图、层次用树。递归与分治:基线条件 + 递归关系;分治分解→解决→合并,子问题不重叠时高效。动态规划:重叠子问题用记忆化或递推避免重复计算;状态、转移、边界、顺序四要素。贪心:每步局部最优、不回溯;需贪心选择性质与最优子结构。排序、二分、DFS/BFS、最短路与 MST 是常考常用的工具。

三、后续学习方向

刷题巩固:LeetCode、牛客、Codeforces 等按「数组/链表/树/图/DP/贪心」标签刷题,先做简单与中等,再挑困难。进阶主题:字符串(KMP、字典树、AC 自动机)、高级数据结构(线段树、树状数组、并查集进阶)、网络流、计算几何等,可按兴趣与方向选读。书籍与课程:《算法导论》《算法》(Sedgewick)、慕课/ B 站上的数据结构与算法课程,可与本课互为补充。面试准备:本课覆盖的栈、队列、哈希、树、图、排序、二分、DP、贪心都是高频考点,建议每章配合 3~5 道经典题反复练。

四、综合练习

下面三道题综合运用多章知识,均给出 Python3 实现(类型标注与注释)。

练习 1:两数之和(哈希表)

题目:数组 nums 和 target,找两个不同下标 i、j 使 nums[i]+nums[j]=target。返回任意一组 [i,j]。

from typing import List


def two_sum(nums: List[int], target: int) -> List[int]:
    """一次遍历:用字典记录「值→下标」,对当前 x 查 target-x 是否已出现。"""
    seen: dict = {}
    for i, x in enumerate(nums):
        need = target - x
        if need in seen:
            return [seen[need], i]
        seen[x] = i
    return []

涉及:哈希表(第 6 章)— O(n) 时间、O(n) 空间。

练习 2:二叉树层序遍历(BFS)

题目:二叉树根节点 root,返回层序遍历结果(每层一个列表)。

from typing import List, Optional
from collections import deque


class TreeNode:
    def __init__(self, val: int = 0, left: Optional["TreeNode"] = None, right: Optional["TreeNode"] = None) -> None:
        self.val = val
        self.left = left
        self.right = right


def level_order(root: Optional[TreeNode]) -> List[List[int]]:
    """队列 BFS:按层扩展,每层记录当前层节点数,出队对应个数并收集值。"""
    if not root:
        return []
    q: deque = deque([root])
    result: List[List[int]] = []
    while q:
        level: List[int] = []
        for _ in range(len(q)):
            node = q.popleft()
            level.append(node.val)
            if node.left:
                q.append(node.left)
            if node.right:
                q.append(node.right)
        result.append(level)
    return result

涉及:树(第 7 章)、队列与 BFS(第 5、10 章)。

练习 3:买卖股票的最佳时机(贪心/DP)

题目:数组 prices[i] 为第 i 天股价,最多完成一笔交易(买一次卖一次),求最大利润。

from typing import List


def max_profit(prices: List[int]) -> int:
    """贪心:维护「至今最低价」min_price,每天用 当天价-min_price 更新最大利润。"""
    if not prices:
        return 0
    min_price = prices[0]
    best = 0
    for p in prices[1:]:
        best = max(best, p - min_price)
        min_price = min(min_price, p)
    return best

涉及:贪心(第 16 章)或可理解为 DP(以 i 结尾卖出的最大利润)。

练习 4:有效的括号(栈)

题目:字符串只含 '()[]{}',判断括号是否有效(成对且顺序正确)。

def is_valid(s: str) -> bool:
    """栈:左括号入栈,右括号与栈顶匹配则弹栈,否则无效;最后栈空才有效。"""
    stack: list = []
    pair = {')': '(', ']': '[', '}': '{'}
    for c in s:
        if c in '([{':
            stack.append(c)
        else:
            if not stack or stack[-1] != pair[c]:
                return False
            stack.pop()
    return len(stack) == 0

涉及:栈(第 5 章)— 经典匹配问题。

结语: 数据结构与算法没有终点,多写、多总结、多和实际问题结合,你会越来越顺手。祝你在后续刷题与项目中用得顺畅。