最近在刷 「剑指 Offer」
第一天的题,把自己的小心得放在这里做记录
1. 栈
(第一遍刷题)
可以用列表实现,栈的特性是先进后出,[1,2,3],我只需要列表[::-1]就可以了;队列的特性是先进先出,[1,2,3],遍历一下就可以了。感觉是披着栈和队列的外皮考列表。
def deleteHead(self) -> int:
if not self.stack_out:
if not self.stack_in:
return -1
else:
for i in range(len(self.stack_in)):
# while self.stack_in:
self.stack_out.append(self.stack_in.pop())
return self.stack_out.pop()
# 第一个if 和 else 的return 一样,所以这个return就拿出来了,本来如果只是if的return,应该写在if后面
(第二遍刷题)
while self.res:
self.tmp.append(self.res.pop())
return self.tmp.pop()
- 一边弹出一边加入
- 所有的情况都是放在deleteHead函数里考虑的,正常弹出(2种) 和 -1
2. math.inf
(第一次刷题)
这个才是最让我觉得惊奇的地方,回宿舍的路上还在想。受同学启发(下图),回宿舍的路上想了一下,我回答的不全,还有开头那句min_stack=[math.inf] 要改成max_stack = [math.-inf]。这个设计真的挺巧的。在我看来有两个作用。第一是解决的索引维度会超的问题out of range。因为在min(x, min_stack[-1])比较时,用到了最小栈里的最后一个值,但第一轮的话,最小栈里实际上是空的,设计了一个无穷大放进去,就是有值的了,就不会有out of range。第二个作用是,因为这题要求最小栈,我放个无穷大,在第一轮的比较过程中,一定一定会把x放进去的。就很强!
(第二次刷题)
分析题目可知,两个要求:
1、定义栈的数据结构
2、实现min、push、pop三种功能
push和pop是常规,用列表的append和pop就能实现
min要求能够得到最小值,构建辅助栈,使得每一次加入时都是当前时的最小值。既然是“每一次加入时
”,就写到push函数里即可。
def push(self, x: int) -> None:
self.stack.append(x)
self.min_stack.append(min(x,self.min_stack[-1]))
总结:
第一题,两个列表实现一个队列,栈在某种程度上很像列表,栈是先进后出的,每次弹出的都是最后一个值,也就是list.pop(),每次加入的值也在末尾list.append(value).
经典例题:括号匹配
需要用到 字典、遍历,如果是左边符号全部压栈,如果是右边符号判断是否匹配