「剑指 Offer」Python-刷题心得1

博主分享了在刷《剑指Offer》中关于栈和队列实现的心得,指出可以用列表快速实现栈和队列的特性。对于最小栈问题,通过初始化为负无穷大避免了索引越界,并确保了最小值始终能被正确存储。同时,博主强调了在实际解题中要考虑各种边界情况。
摘要由CSDN通过智能技术生成

最近在刷 「剑指 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).
经典例题:括号匹配
需要用到 字典、遍历,如果是左边符号全部压栈,如果是右边符号判断是否匹配

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值