美文网首页java面试程序员iOS技术点
LeetCode题集整理- 栈、队列、堆

LeetCode题集整理- 栈、队列、堆

作者: AKyS佐毅 | 来源:发表于2017-11-28 16:12 被阅读584次

1、预备知识点

  • 栈(Stack)和队列(Queue)是两种操作受限的线性表。

  • (线性表:线性表是一种线性结构,它是一个含有n≥0个结点的有限序列,同一个线性表中的数据元素数据类型相同并且满足“一对一”的逻辑关系。
    “一对一”的逻辑关系指的是对于其中的结点,有且仅有一个开始结点没有前驱但有一个后继结点,有且仅有一个终端结点没有后继但有一个前驱结点,其它的结点都有且仅有一个前驱和一个后继结点。)

  • 这种受限表现在:栈的插入和删除操作只允许在表的尾端进行(在栈中成为“栈顶”),满足“FIFO:First In Last Out”;队列只允许在表尾插入数据元素,在表头删除数据元素,满足“First In First Out”。

  • 栈与队列的相同点:

    • 1.都是线性结构。

    • 2.插入操作都是限定在表尾进行。

    • 3.都可以通过顺序结构和链式结构实现。

    • 4.插入与删除的时间复杂度都是O(1),在空间复杂度上两者也一样。

    • 5.多链栈和多链队列的管理模式可以相同。

  • 栈与队列的不同点:

    • 1.删除数据元素的位置不同,栈的删除操作在表尾进行,队列的删除操作在表头进行。

    • 2.应用场景不同;常见栈的应用场景包括括号问题的求解,表达式的转换和求值,函数调用和递归实现,深度优先搜索遍历等;常见的队列的应用场景包括计算机系统中各种资源的管理,消息缓冲器的管理和广度优先搜索遍历等。

    • 3.顺序栈能够实现多栈空间共享,而顺序队列不能。

  • 栈的一般操作
    • empty() 堆栈为空则返回真
    • pop() 移除栈顶元素
    • push() 在栈顶增加元素
    • size() 返回栈中元素数目
    • top() 返回栈顶元素
  • 栈的基本操作
    • empty() 队列为空则返回真
    • front() 返回队列头部元素
    • back () 返回队列尾部元素
    • pop() 弹出队列头部元素
    • push() 将元素添加到队列
    • size() 返回队列中元素数目

2.常见题目思考

  • 设计一个栈,支持基本的栈操作,这个栈的内部存储数据的结构是队列。队列的方法只能包括push \ front \ pop \ size \ empty等标准的队列方法
  • 设计一个队列,支持基本的队列操作,这个队列的内部存储数据结构为栈,栈的方法只能包括 push \ top \ pop \ size \empty 等标准的栈方法。
  • 设计一个栈,支持如下操作,这些操作的算法复杂度需要是常数级,O(1) 1.push(x) : 将元素x压入栈中 2.pop() : 弹出(移除)栈顶元素 3.top() : 返回栈顶元素 4.getMin() : 返回栈内最小元素
  • 已知从1至n的数字序列,按顺序入栈,每个数字入栈后即可出栈,也可在栈中停留,等待后面的数字入栈出栈后,该数字再出栈,求该数字序列的出栈序列是否合法?

思路:

  • 1:出栈结果存储在队列order 中。
  • 2:按元素顺序,将元素push进入栈。
  • 3: 每push 一个元素,即检查是否与队列首部元素相同则弹出队列首元素,弹出栈顶元素,直到两元素不同结束。
  • 4: 若最终栈为空,说明序列合法,否则不合法。

二叉堆的属性

  • 最大堆:根结点的键值是所有堆结点键值中最大者,且每个结点的值都比其孩子的值大。

  • 最小堆:根结点的键值是所有堆结点键值中最小者,且每个结点的值都比其孩子的值小。

  • 已知一个未排序的数组,求这个数组中第K大的数字!

    • 思路:
    • 维护一个K大小的最小堆,堆中元素个数小于K时,新元素直接进入堆;否则,当堆顶小于新元素时,弹出堆顶,将新元素加入堆。
    • 解释: 由于堆是最小堆,堆顶是堆中最小元素,新元素都会保证比堆顶小(否则新元素替换堆顶),故堆中K个元素是已扫描的元素里最大的K个;堆顶即为第K大的数。
  • 设计一个数据结构,该数据结构动态维护一组数据,且支持如下操作:

    • 1.添加元素: void addNum(int num),将整型num添加至数据结构中。

    • 2.返回数据的中位数: double findMedian(),返回其维护的数据的中位数。 中位数定义: 1.若数据个数为奇数,中位数是该组数排序后中间的数。[1,2,3] -> 2 2.若数据个数为偶数,中位数是该组数排序后中间的两个数字的平均值。[1,2,3,4] -> 2.5

    • 思路:

      • 动态维护一个最大堆和一个最小堆,最大堆存储一半的数据,最小堆存储一半的数据,维持最大堆的堆顶比最小堆的堆顶小。

241天以来,Java架构更新了 602个主题,已经有100+位同学加入。微信扫码关注java架构,获取Java面试题和架构师相关题目和视频。上述相关面试题答案,尽在Java架构中。

相关文章

网友评论

    本文标题:LeetCode题集整理- 栈、队列、堆

    本文链接:https://www.haomeiwen.com/subject/jzysbxtx.html