数据结构与算法 - 01基础数据结构

  • 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
        • 方法:
          • 左右根
        • 应用场景
          • 对某个节点进行分析时,需来自左右子树的信息;从树的底部不断往上进行
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章