【玩转算法】栈、队列、优先队列、双端队列

  1. 特点
    1. 栈的最大特点就是后进先出(LIFO)。对于栈中的数据来说,所有操作都是在栈的顶部完成的,只可以查看栈顶部的元素,只能够向栈的顶部压⼊数据,也只能从栈的顶部弹出数据。
    2. 栈顶元素反映了在嵌套的层次关系中,最近的需要匹配的元素。
  2. 实现
    1. 利用一个单链表来实现栈的数据结构。而且,因为我们都只针对栈顶元素进行操作,所以借用单链表的头就能让所有栈的操作在 O(1) 的时间内完成。
  3. 应用场景
    1. 在解决某个问题的时候,只要求关心最近一次的操作,并且在操作完成了之后,需要向前查找到更前一次的操作。
  4. 注意
    1. 如果打算用一个数组外加一个指针来实现相似的效果,那么,一旦数组的长度发生了改变,哪怕只是在最后添加一个新的元素,时间复杂度都不再是 O(1),而且,空间复杂度也得不到优化。
    2. 栈是许多 LeetCode 中等难度偏上的题目里面经常需要用到的数据结构,掌握好它是十分必要的。
  5. 求解算术表达式的结果
    1. LeetCode 第 224 题:基本计算器
    2. LeetCode 第 227 题:基本计算器 II
    3. LeetCode 第 772 题:基本计算器 III
    4. LeetCode 第 770 题:基本计算器 IV
  6. 栈经典例题
    1. LeetCode 第 20 题:有效的括号
    2. LeetCode 第 150 题:逆波兰表达式求值,需考虑运算符种类?表达式的数字类型
    3. LeetCode 第 71 题:简化路径,需考虑路径是否合法?不能回退的情况?多余的/如何处理?
  7. 递归和栈的关系
    1. LeetCode 第 144 题:二叉树的前序遍历
    2. LeetCode 第 94 题:二叉树的中序遍历
    3. LeetCode 第 145 题:二叉树的后序遍历
    4. LeetCode 第 341 题:扁平化嵌套列表迭代器

队列(Queue)

  1. 特点
    1. 和栈不同,队列的最大特点是先进先出(FIFO),就好像按顺序排队一样。对于队列的数据来说,我们只允许在队尾查看和添加数据,在队头查看和删除数据。
  2. 实现
    1. 可以借助双链表来实现队列。双链表的头指针允许在队头查看和删除数据,而双链表的尾指针允许我们在队尾查看和添加数据。
  3. 应用场景
    1. 直观来看,当我们需要按照一定的顺序来处理数据,而该数据的数据量在不断地变化的时候,则需要队列来帮助解题
    2. 在算法面试题当中,广度优先搜索(Breadth-First Search)是运用队列最多的地方
    3. 树问题中,BFS解决了层序遍历,图问题中,BFS解决了无权图的最短路径
    4. BFS经典例题
      1. LeetCode 第 279 题:完全平方数
      2. LeetCode 第 127 题:单词接龙
      3. LeetCode 第 126 题:单词接龙 II
  4. 队列经典例题
    1. LeetCode 第 102 题:二叉树的层序遍历
    2. LeetCode 第 107 题:二叉树的层次遍历 II
    3. LeetCode 第 103 题:二叉树的锯齿形层次遍历
    4. LeetCode 第 199 题:二叉树的右视图
    5. LeetCode 第 126 题:单词接龙 II

优先队列

  1. 特点
    1. 能保证每次取出的元素都是队列中优先级别最高的。优先级别可以是自定义的,例如,数据的数值越大,优先级越高;或者数据的数值越小,优先级越高。优先级别甚至可以通过各种复杂的计算得到。
    2. 优先队列的底层实现是
  2. 应用场景
    1. 从一堆杂乱无章的数据当中按照一定的顺序(或者优先级)逐步地筛选出部分乃至全部的数据。
  3. 经典例题
    1. LeetCode 第 347 题:前 K 个高频元素,K是不合法的字符应如何处理?
    2. LeetCode 第 23 题:合并K个排序链表,可以完成K分的归并排序算法

双端队列(Deque)

  1. 特点
    1. 双端队列和普通队列最大的不同在于,它允许我们在队列的头尾两端都能在 O(1) 的时间内进行数据的查看、添加和删除
  2. 实现
    1. 与队列相似,我们可以利用一个双链表实现双端队列
  3. 应用场景
    1. 双端队列最常用的地方就是实现一个长度动态变化的窗口或者连续区间,而动态窗口这种数据结构在很多题目里都有运用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值