js 包含min函数的栈_剑指offer 包含min函数的栈

题目描述

定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。

原理:

用空间换时间,用时间换空间;增加空间来减少时间的消耗

方法1:

考虑两个栈的长度相同,栈中添加一个,min栈也添加一个,删除一个,min栈也删除一个。每次添加数据的时候,向min栈添加一个当前栈中最小元素的节点;原始栈中删除一个,min栈从栈顶删除一个。两个栈的长度始终相同。

示例代码:

class Solution:
    # 给这个类一个初始的属性,有一个栈,另外有一个最小值的列表栈
    def __init__(self):
        self.stack = []
        self.minValue = []
    def push(self, node):
        self.stack.append(node)
        # 如果最小值列表里有值
        if self.minValue:
            #如果最小值列表里的最后一个值 大于 node 这个值,说明node这个值小,那么就放进最小值列表中;
            if self.minValue[-1] > node:
                self.minValue.append(node)
             # 如果列表里面的最后一个值,小于node值,那么就说明node这个值大;那么就添加上次添加进来的那个小的值,与栈中的数据长度保持一致;
            else:
                self.minValue.append(self.minValue[-1])
        # 如果最小值列表里面没有值,就在最小值列表里添加node
        else:
            self.minValue.append(node)
    def pop(self):
        # 如果栈为空,返回none,说明没有在栈中无元素,没有最小值
        if self.stack == []:
            return None
        # 栈的长度与最小值的栈的长度要相同,所以最小值列表也需要删除一个
        self.minValue.pop()
        # 栈不为空,就需要删除一个,删除做pop 操作;返回我们删除的那个数
        return self.stack.pop()
    
    def top(self): # 栈顶
        # 栈为空,返回none
        if not self.stack:
            return None
        # 栈不为空,返回栈顶元素
        return self.stack[-1]
    def min(self):
        # 栈为空,返回none
        if self.minValue == []:
            return None
        return self.minValue[-1]

方法2:

原始栈和min栈的长度不同。原始栈中添加一个,判断当前添加的元素是否比当前min栈中的最小的元素小,如果当前添加的元素比当前min栈中的元素小,则把当前添加的元素添加到min栈中,否则,min栈中不添加元素。原始栈中删除一个,判断当前删除的原始栈中的元素是否与min栈中最小的元素相同(即min栈的栈顶的元素),若相同,则删除min栈中栈顶的元素,否则,min栈不删除元素。

class Solution:
    def __init__(self):
        self.stack = []
        self.minValue = []
    def push(self, node):
        self.stack.append(node)
        if self.minValue:
            # 如果最小值列表里的最后一个值 大于 node 这个值,说明node这个值小,那么就放进最小值列表中;
            if self.minValue[-1] > node:
                self.minValue.append(node)
             # 最后一个值不大于node这个值得话;不做操作,不需要把它两个做的长度一致
        else:
            self.minValue.append(node)
    def pop(self):
        if self.stack == []:
            return None
        # 删除的时候,判断要删除的元素是不是与min栈里的最后一个元素,如果是,也需要删除min栈中栈顶的元素
        if self.stack[-1] == self.minValue[-1]:
            self.minValue.pop()
            return self.stack.pop()
        # 如果要删除的元素与min栈中栈顶元素不等,不需要删除min栈中栈顶的元素
        else:
            return self.stack.pop()
    def top(self):
        if self.stack == []:
            return None
        return self.stack[-1]
    def min(self):
        if self.minValue == []:
            return None
        return self.minValue[-1]

99e4ab297f6823fb9e9f50a01bdee522.png
欢迎关注,一起学习

视频链接:https://www.bilibili.com/video/av64288683?p=15

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值