栈和队列高频面试题精讲ppt课件

上传人:钟*** 文档编号:928244 上传时间:2019-09-30 格式:PPT 页数:21 大小:1.84MB
返回 下载 相关 举报
栈和队列高频面试题精讲ppt课件_第1页
第1页 / 共21页
栈和队列高频面试题精讲ppt课件_第2页
第2页 / 共21页
栈和队列高频面试题精讲ppt课件_第3页
第3页 / 共21页
点击查看更多>>
资源描述
栈和队列面试题精讲,1,2/21,提纲,线性表简介 面试题总体分析 一些例题 例1 元素出入栈顺序合法性判断 例2 用两个队列实现一个堆栈 例3 用两个堆栈实现一个队列 例4 支持查询最小值的堆栈 例5 单调堆栈最大直方图 例6 单调队列滑动窗口最大值 总结,线性表简介,堆栈和队列统称线性表 简单的线性结构 数组和链表可以实现这两种数据结构 堆栈 后进先出 (Last In First Out) 队列 先进先出 (First In First Out),3/21,面试题总体分析,堆栈 基本理解 DFS 深度优先按深度遍历 递归转非递归 队列 基本理解 BFS 广度优先按层序遍历,4/21,例1 元素出入栈顺序合法性判断,例1 给定一些元素的入栈顺序和出栈顺序,问是否可能?(假设所有元素都不相同) 分析: 模拟堆栈即可,如果当前要出栈的元素恰好在栈顶,则必须出栈,否则就入栈。(注意判断两个vector size一样) bool isPossible(vector ,5/21,例2 用两个队列实现一个堆栈,例2 如何用两个队列实现一个堆栈? 队列无论怎么折腾,元素顺序不会改变! 两个队列来回倒,保证一个队列是空的,用空队列临时存储除队尾外所有元素 例如 q1非空,q2是空的,要出“栈”,实际上要出的是q1里面最后一个元素,我们把q1里面元素一个一个放入q2里面(所有元素的顺序不会变化),直到剩下一个,再让它出队即可,6/21,例2 续,入“栈”:维护一个队列是空的 : O(1) push(x) : if (!q1.empty() q1.push(x); else q2.push(x); 出“栈”:用一个队列临时存放元素 : O(n) pop() : if (!q1.empty() while (q1.size() 1) q2.push(q1.front(); q1.pop(); q1.pop(); else /类似操作,7/21,例3 用两个堆栈实现一个队列,例3 如何堆栈实现一个队列? s1负责“入队”,s2负责“出队”(反向) 入队直接入到s1里 要出队如果s2非空,则先从s2出,否则把s1里面全部元素压入s2中 理解: s1负责存放入队元素 s2负责出队并反向 每个元素实际上反向了两次,出入一次s1,出入一次s2,8/21,例3 续,push(x): O(1) s1.push(x) pop: 均摊O(1) 每个元素出入两个栈各1次 if (s2.empty() while (!s1.empty() s2.push(s1.top(); s1.pop(); s2.pop();,9/21,例4 支持查找最小元素的堆栈,一个堆栈除了支持push, pop以外还要支持一个操作getMin得到当前堆栈里所有元素的最小值 方法1(笨) 用两个堆栈,s1和s2,s1正常使用, s2一直是空的 getMin的时候,把s1的元素一个一个弹出到s2,每弹出一个,顺便求当前的最小值,然后再从s2把元素一个一个弹回到s1,也清空了s2: O(n),10/21,例4 续1,方法2 用两个堆栈,s1维护原来的值,s2维护最小值 它们元素个数一样多 push(x): O(1) s1.push(x); if (!s2.empty() ,11/21,例4 续2,方法3 思路不变, s2真的需要存储那么多值么? 假设之前入过一个最小值,s2的顶端存了许多相同的最小值 push(x): O(1) s1.push(x); if (s2.empty() | s2.top() = x) s2.push(x); pop : O(1) if (s1.top() = s2.top() s2.pop(); s1.pop();,12/21,例5 最大直方图,例5 给出一个直方图,求最大面积矩形 (Leetcode 84) 用堆栈计算每一块板能延伸到的左右边界 对每一块板 堆栈顶矮,这一块左边界确定,入栈 堆栈顶高,堆栈顶右边界确定,出栈,计算面积 入栈时左边界确定 出栈时右边界确定 堆栈里元素是递增的 本质:中间的短板没有用! 复杂度 O(n),13/21,例5 续1,14/21,例5 续2,15/21,例6 滑动窗口最大值,给定一个数组a0n,还有一个值k,计算数组bi = max(ai k + 1 i) 注意认为负数下标对应值是无穷小 方法1: 用一个最大堆存放最近的k个数 计算好bi 1后 ai k出堆, 如何找到ai k? ai入堆 bi = 堆顶 时间复杂度O(nlogk),16/21,例6 续1,方法2 如果同时存在一个旧的数x,和一个新的数y并且x y,则x永远不会是我们要的解。因为: “窗口”朝右滑动 x先离开窗口 y进入窗口后x与y总是同时存在,直到x离开 x没用了 利用这个性质? 双端队列,队头存旧的数,队尾存新的数 如果队尾的数将要入队的数ai,则扔掉队尾的数 队列里的从队头到队尾是单减的,队头永远是窗口最大值 考虑: 队头何时过期? 时间复杂度? O(n) :每个元素出入队一次,17/21,例6 续2,K = 3,18/21,例6 续3,实现: for (int i = 0; i n; +i) while (!q.empty() 理解: 旧的数比较大,因为“过期”而“不得不”出队 存放a数组的“下标”而没存放具体值 扩展 如果输入是一个流,我们必须自己保存“时间戳”,决定过期。,19/21,总结,理解队列堆栈的基本概念 n个左右括号的出入栈顺序有多少种?(Catalan数) 熟悉队列、堆栈的应用 递归和非递归的转化 dfs Bfs搜索 维护队列和堆栈的单调性 利用顺序,20/21,谢谢大家,更多视频尽在: 免费视频 直播课程 面试问答 Contact us:微博 七月算法 七月问答 曹鹏博士,21/21,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸设计 > 毕设全套


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!