题目难度: 简单
原题链接
今天继续更新剑指 offer 系列, 这道题依然很经典, 考察了两个基础数据结构和它们的特性. 题目思考部分加了一些进阶问题, 感兴趣的小伙伴可以先想想看, 最后有答案哦
若无意外, 每天晚上 6 点 45 分准时更新, 中间可能会穿插一些周赛题解. 大家在我的公众号"每日精选算法题"中的聊天框中回复 offer 就能看到该系列当前已经更新的文章了
大家有什么想法建议和反馈的话欢迎随时交流, 包括但不限于公众号聊天框/知乎私信评论等等~
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail
和 deleteHead
,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead
操作返回 -1 )
appendTail
、deleteHead
进行 10000 次调用[null,null,3,-1]
[null,-1,null,null,5,2]
(思考题答案在最后)
O(1)
O(1)
. 因为第一次删除导入一批后, 之后该批的删除都只需要常数时间的弹出, 分摊下来每个数字的删除都只需要 O(1)
. 当然如果只删除一次的话, 那还是需要把之前所以插入的都倒过来, 这样就是 O(N)
了…O(N)
class CQueue:
def __init__(self):
# 存较新的尾部插入数字
self.stackIn = []
# 存较老的逆序数字
self.stackOut = []
def appendTail(self, value: int) -> None:
# 直接压入stackIn
self.stackIn.append(value)
def deleteHead(self) -> int:
if self.stackOut:
# stackOut还有数字, 直接pop
return self.stackOut.pop()
if not self.stackIn:
# stackIn也没有数字, 队列为空
return -1
while self.stackIn:
# 将stackIn的数字倒序导入stackOut中
self.stackOut.append(self.stackIn.pop())
# 弹出stackOut
return self.stackOut.pop()
O(1)
, 弹出 O(N)
(由于队列无法倒置导出, 所以无法做到一部分弹出只使用常数时间, 而是每次都要导出除了最后一个数字到另一个队列, 均摊复杂度无法达到 O(1)
)O(1)
弹出了[1,2,3]
(根据翻转操作, 该队列真实的插入时序是 3=>2=>1
), 新数字是 4, 那么刚进队的时候是[1,2,3,4]
, 搬过去后就是[4,1,2,3]
, 队列头就是栈顶了 (加上数字后的插入时序是3=>2=>1=>4
, 栈顶到栈底依次是4=>1=>2=>3
, 正是对应现在队列的顺序)O(N)
, 弹出 O(1)
大家可以在下面这些地方找到我~
我的知乎专栏
我的 CSDN
我的 Leetcode
我的牛客网博客
我的公众号: 每日精选算法题, 欢迎大家扫码关注~