- 1. 数组 Array
-
- 优点
-
-
- 构建非常简单
- 能再 O(1) 的时间里根据数据的下标 (index) 查询某个元素
-
-
- 缺点
-
-
- 构建时必须分配一段连续的空间
- 查询某个元素是否存在时,需遍历整个数组 O(1)
- 删除和添加时,耗时 O(1)
-
-
- 应用场景
-
-
- 元素大小确定,删除插入不多
- 根据下标查询数据
-
-
- 练习
-
-
- LC242:两个字符串 s 和 t,判断 t 是否是 s 的字母异位词 (字母相同,顺序不同)
-
- 2. 链表 LinkedList
-
- 优点
-
-
- 灵活地分配内存空间
- 在 O(1) 时间内 删除或添加元素,前提:该元素的前一个元素已知【双链表 可以是后一元素】
-
-
- 缺点
-
-
- 不像数组能通过下标迅速读取元素,每次都要从链表头开始一个个读取
- 查询第 k 个元素需要 O(k) 时间
-
-
- 应用场景
-
-
- 元素个数不确定,且需要经常添加和删除
-
-
- 练习 - 使用快慢指针 或 三指针
-
-
- 链表的翻转;寻找倒数第 K 个元素;寻找链表中间元素;链表是否有环
- LC25:给你一个链表,每 k 个节点一组进行翻转,返回翻转后的链表
-
- 3. 栈 Stack
-
- 特点
-
-
- 后进先出 LIFO;所有的操作都在栈顶完成
- 只能查看栈顶元素;只能向栈顶插入、弹出数据
-
-
- 实现
-
-
- 利用 单链表 实现
- 借用单链表的头,就能让所有栈操作在 O(1) 时间内完成
-
-
- 应用场景
-
-
- 只关心最近一次的操作,且操作完成后,向前查找更前一次的操作
-
-
- 注意
-
-
- 若用一个数组 + 一个指针来实现,一旦数组长度发生变化,时间复杂度都不再是 O(1),空间复杂度也得不到优化
-
-
- 练习
-
-
- LC20:给定只包含 (){}[] 的字符串,判断字符串是否匹配
- LC739:根据气温列表,重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替
-
-
-
-
- 给定 T:[23, 25, 21, 19, 22, 26, 23]
- 返回 D: [ 1, 4, 2, 1, 1, 0, 0]
-
-
- 4.1 队列 Queue
-
- 特点
-
-
- 先进先出 FIFO
- 队尾查看 和 添加 数据,对头查看 和 删除 数据
-
-
- 实现
-
-
- 双链表
- 双链表的 头指针 允许在队头查看 和 删除数据
- 双链表的尾指针 允许在队尾查看 和 添加数据
-
-
- 应用场景
-
-
- 需要按照一定的顺序来处理数据,而该数据的数据量在不断地变化的时候
- 广度优先搜索 Breadth-First-Search
-
-
- 练习
-
-
- LC239:给一数组 nums,有一大小为 k 的滑动窗口从数组的最左侧移到数组的最右侧。你只可以看到在滑动窗口 k 内的数字,滑动窗口每次只向右移动一位。返回滑动窗口最大值
-
-
-
-
- 输入:nums = [1, 3, -1, -3, 5, 3, 6, 7],k = 3
- 输出:[3, 3, 5, 5, 6, 7]
-
-
- 4.2 双端队列 Deque
-
- 特点
-
-
- 允许在队列的头尾两端,在 O(1) 时间内进行数据的 查看、添加 和 删除
-
-
- 实现
-
-
- 双链表
-
-
- 应用场景
-
-
- 实现一个长度动态变化的窗口 或者 连续区间
-
- 5. 树 Tree
-
- 常用树
-
-
- 普通二叉树、平衡二叉树、完全二叉树、二叉搜索树、四叉树(Quadtree)、多叉树(N-ary Tree)
-
-
- 特殊树 - 不常考
-
-
- 红黑树(Red-Black Tree)、自平衡二叉搜索树(AVL Tree)
-
-
- 考点
-
-
- 树的遍历、序列化(serialization)
-
-
- 树的遍历
-
-
- a) 前序遍历 Preorder Traversal
-
-
-
-
- 方法:
-
-
-
-
-
-
- 根左右
-
-
-
-
-
-
- 应用场景
-
-
-
-
-
-
- 运用最多:树中进行搜索 以及 创建一棵新树
-
-
-
-
-
- b) 中序遍历 Inorder Traversal
-
-
-
-
- 方法:
-
-
-
-
-
-
- 左根右
-
-
-
-
-
-
- 应用场景
-
-
-
-
-
-
- 二叉搜索树:左孩子小于根节点,根节点小于右孩子
- 二叉搜索树 排序:按照中序遍历,得到从小到大排列
-
-
-
-
-
- c) 后序遍历 Postorder Traversal
-
-
-
-
- 方法:
-
-
-
-
-
-
- 左右根
-
-
-
-
-
-
- 应用场景
-
-
-
-
-
-
- 对某个节点进行分析时,需来自左右子树的信息;从树的底部不断往上进行
-
-
-