《剑指offer》- [第4章:解决面试题的思路 - 4.3:举例让抽象问题具体化] -题21:包含min函数的栈

1、问题描述

定义栈的数据结构,并在该类型中实现一个能得到栈中最小元素的min函数。要求min,push,和pop操作的时间复杂度为 O ( 1 ) O(1) O(1)

2、解题思路

  • 思路1:可以借助一个辅助栈,每次在对数据栈做压栈操作时,同时也把数据栈中的最小元素压入辅助栈;而对数据栈做弹出操作时,同时也将辅助栈中的栈顶元素弹出。
  • 以下面这个具体例子来解释思路1:
步骤操作数据栈辅助栈最小值
1压入3333
2压入43,43,33
3压入23,4,23,3,22
4压入13,4,2,13,3,2,11
5弹出3,4,23,3,22
6弹出3,43,33
7压入03,4,03,3,00

表1:栈内连续压入3,4,2,1之后两次弹出栈顶元素再压入0时数据栈、辅助栈、以及最小值的状态

3、代码实现

# -*- coding:utf-8 -*-
class Solution:
    datastack = []
    minstack = []
    def push(self, node):
        # write code here
        if len(self.minstack) == 0 :
            self.minstack.append(node)
        else:
            if node < self.minstack[-1]:
                self.minstack.append(node)
            else:
                self.minstack.append(self.minstack[-1])
                
        self.datastack.append(node)
                
    def pop(self):
        # write code here
        if len(self.datastack) > 0 and len(self.minstack) > 0:
            self.datastack.pop()
            self.minstack.pop()
            
    def top(self):
        # write code here
        if len(self.datastack) > 0:
            return self.datastack[-1]
        else:
            return 
    def min(self):
        # write code here
        if len(self.datastack) > 0 and len(self.minstack) > 0:
            return self.minstack[-1]
        else:
            return 
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Albert_YuHan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值