目录

数据结构(零):基础

#1 链表与数组

  • 链表和数组是最基本的数据结构,是其他数据结构的基础
  • 数组和链表的区别
    • 数组和链表都是线性数据结构,区别在于数组具有索引,数组中的元素在内存中是连续存储的;链表是把一些分离独立的元素按引用链接到一起
    • 数组能在 O(1) 时间内访问到元素,但需要 O(N) 时间插入、删除元素,与链表相反。
  • 数组可以嵌套数组,得到多维数组。二维数组常和 dfs、bfs 遍历相关

python 中的栈和堆基于数组,而内置库 deque 是用双向链表实现的。

例题

数组:

  • 0080 删除排序数组中的重复项 II

  • 0283 移动零

  • 0448 找到所有数组中消失的数字

  • 0485 最大连续 1 的个数

  • 0724 寻找数组的中心下标

  • 0075 颜色分类

  • 0128 最长连续序列

  • 0189 旋转数组

  • 0238 除自身以外数组的乘积

  • 0041 缺失的第一个正数

  • 0284 顶端迭代器

  • 0287 寻找重复数 二维数组:

  • 0048 旋转图像

  • 0054 螺旋矩阵

  • 0059 螺旋矩阵 II

  • 0073 矩阵置零

  • 0289 生命游戏

  • 0463 岛屿的周长

  • 0835 图像重叠

  • 1992 找到所有的农场组 链表:

  • 0707 设计链表

  • 0002 两数相加

  • 0024 两两交换链表中的节点

  • 0082 删除排序链表中的重复元素 II

  • 0237 删除链表中的节点

  • 0061 旋转链表

  • 0086 分隔链表

  • 0328 奇偶链表

  • 0725 分隔链表

  • 0021 合并两个有序链表

  • 0023 合并K个升序链表

  • 0147 对链表进行插入排序

  • 0148 排序链表 快慢指针:

  • 0019 删除链表的倒数第 N 个结点

  • 0141 环形链表

  • 0142 环形链表 II

  • 0160 相交链表

  • 0876 链表的中间结点

  • 0138 复制带随机指针的链表

  • 0430 扁平化多级双向链表

  • 0432 全 O(1) 的数据结构

  • 1206 设计跳表

  • 0206 反转链表

  • 0092 反转链表 II

  • 0025 K 个一组翻转链表

  • 0143 重排链表

  • 0234 回文链表

#2 字符串

  • 字符串和数组很相似,具有索引,且元素在内存中是连续存储的

python 中的字符串是不可变的,不能直接修改、添加、删除元素,而应该用切片。

例题

  • 0009 回文数
  • 0165 比较版本号
  • 0392 判断子序列
  • 0831 隐藏个人信息
  • 1169 查询无效交易
  • 0068 文本左右对齐
  • 0393 UTF-8 编码验证
  • 0459 重复的子字符串
  • 0686 重复叠加字符串匹配
  • 0833 字符串中的查找与替换
  • 0564 寻找最近的回文数
  • 0866 回文素数

#3 哈希表

  • 哈希表是针对查询,空间换时间的一种数据结构
  • 一般能够在 O(1) 时间内插入、查询、删除元素,但不能通过下标访问元素
  • 哈希表分为哈希集合和哈希映射
    • 哈希集合存储非重复值
    • 哈希映射存储 key 唯一的 (key,value) 对

python 中一般直接用内置库 set 和 dict 表示哈希集合和哈希映射。 另外还有一些特定用途的内置库,比如 Counter, defaultdict, OrderedDict。

例题

  • 0705 设计哈希集合
  • 0706 设计哈希映射
  • 0535 设计哈希映射 TinyURL 的加密与解密
  • 0217 存在重复元素
  • 0349 两个数组的交集
  • 0500 键盘行
  • 0575 分糖果
  • 0001 两数之和
  • 0205 同构字符串
  • 0219 存在重复元素 II
  • 0599 两个列表的最小索引总和
  • 0350 两个数组的交集 II
  • 0409 最长回文串
  • 0532 数组中的 k-diff 数对
  • 0594 最长和谐子序列
  • 0015 三数之和
  • 0299 猜数字游戏
  • 0447 回旋镖的数量
  • 0454 四数相加 II
  • 0554 砖墙
  • 0710 黑名单中的随机数
  • 0149 直线上最多的点数
  • 0166 分数到小数
  • 0336 回文对
  • 1178 猜字谜 特殊的键
  • 0036 有效的数独
  • 0049 字母异位词分组
  • 0318 最大单词长度乘积
  • 0676 实现一个魔法字典

#4 栈与队列

  • 栈是一个后入先出的数据结构,插入和删除都在末尾进行
  • 队列是一个先入先出的数据结构,插入在末尾,删除在开头

python 中一般用数组实现栈,用内置库 deque 实现队列 额外地,dfs 的非递归形式借助栈实现,bfs 常借助队列实现

例题

  • 0225 用队列实现栈
  • 0232 用栈实现队列
  • 0622 设计循环队列
  • 0641 设计循环双端队列
  • 0071 简化路径
  • 0150 逆波兰表达式求值
  • 0682 棒球比赛
  • 0946 验证栈序列
  • 1441 用栈操作构建数组
  • 0155 最小栈
  • 0341 扁平化嵌套列表迭代器
  • 0895 最大频率栈
  • 1381 设计一个支持增量操作的栈

#5 树

  • 树是一种非线性的数据结构,本质是节点的有限集。其定义是递归的:
    • 有且仅有一个特定的称为根(root)的节点
    • 当节点数量 > 1 时,其余节点可分为若干个互不相交的有限集,其中每个集合也可以看作一颗树,称之为根的子树。

从图的观点来看,树也可视为一个拥有 N 个节点和 N-1 条边的一个有向无环图。

例题

遍历

  • 0094 二叉树的中序遍历
  • 0103 二叉树的锯齿形层序遍历
  • 0144 二叉树的前序遍历
  • 0145 二叉树的后序遍历
  • 0872 叶子相似的树
  • 0112 路径总和
  • 0113 路径总和 II
  • 0116 填充每个节点的下一个右侧节点指针
  • 0117 填充每个节点的下一个右侧节点指针 II
  • 0655 输出二叉树
  • 0662 二叉树最大宽度 递归
  • 0101 对称二叉树
  • 0226 翻转二叉树
  • 0508 出现次数最多的子树元素和
  • 0606 根据二叉树创建字符串
  • 0671 二叉树中第二小的节点
  • 0814 二叉树剪枝
  • 0106 从中序与后序遍历序列构造二叉树
  • 0110 平衡二叉树
  • 0124 二叉树中的最大路径和
  • 0236 二叉树的最近公共祖先
  • 0337 打家劫舍 III
  • 0834 树中距离之和
  • 0889 根据前序和后序遍历构造二叉树 二叉搜索树
  • 0098 验证二叉搜索树
  • 0108 将有序数组转换为二叉搜索树
  • 0173 二叉搜索树迭代器
  • 0235 二叉搜索树的最近公共祖先
  • 0669 修剪二叉搜索树
  • 0701 二叉搜索树中的插入操作
  • 0096 不同的二叉搜索树
  • 0095 不同的二叉搜索树 II
  • 0450 删除二叉搜索树中的节点
  • 0501 二叉搜索树中的众数
  • 0530 二叉搜索树的最小绝对差
  • 0538 把二叉搜索树转换为累加树
  • 0099 恢复二叉搜索树

#6 堆

  • 堆是一种特别的完全二叉树,每一个节点的值都大于等于或小于等于其孩子节点的值
  • 堆可以在 O(logN) 时间内插入元素、删除根节点,在 O(1) 时间获得最大值或最小值。一般用于有序弹出元素的场景。

python 中一般用内置库 heapq 实现堆的操作(list 实现的),默认是小顶堆,即堆顶元素是最小值。

例题

  • 0703 数据流中的第 K 大元素
  • 1845 座位预约管理系统
  • 0023 合并K个升序链表
  • 0692 前K个高频单词
  • 1046 最后一块石头的重量
  • 0295 数据流的中位数
  • 0355 设计推特
  • 0373 查找和最小的 K 对数字
  • 0786 第 K 个最小的素数分数
  • 1801 积压订单中的订单总数
  • 1834 单线程 CPU
  • 0407 接雨水 II
  • 0857 雇佣 K 名工人的最低成本
  • 1439 有序矩阵中的第 k 个最小数组和

#7 图

  • 图是一种比树形结构更复杂的非线性数据结构
    • 树形结构中的结点是一对多的关系,且有明显的层次关系
    • 图中的顶点是多对多的关系,无明显的层次关系。
  • 按顶点连线(边)是否有方向,可以将图分为有向图和无向图
  • 有些图的边还附带数据信息(权),被称为网或网络
  • 图的遍历和树的遍历相似,但图中可能出现回路
    • 因此常用一个辅助数组或哈希表 vis 记录访问过的顶点

例题

  • 0133 克隆图
  • 0797 所有可能的路径
  • 0841 钥匙和房间
  • 0997 找到小镇的法官