招行算法2020届实习技术面编程题:实现O(1)最小栈(手撸代码)

何为最小栈?栈最基础的操作是压栈(push)和退栈(pop),现在需要增加一个返回栈内最小值的函数(get_min),要求get_min函数的时间复杂度为o(1)。python的栈肯定是使用list实现,只要将list的append和pop封装到stack类中,即实现了压栈和退栈。如果不考虑时间复杂度,我们第一反应一定是min(),min()可以在不开辟新空间的情况下o(n)的返回栈内最小值。但是如果栈内元素很多,并且get_min方法需要频繁调用时,min高耗时的缺点就被放大,那么理想的方法就是空间换时间来降低时间复杂度。

#!/usr/bin/python
# -*- coding: utf-8 -*-

class stack(object):
    stack_list = []
    min_list = []
    min = None

    def push(self, x):
        if not self.stack_list:
            self.min = x
            self.min_list.append(self.min)
            self.stack_list.append(x)
            return
        self.stack_list.append(x)
        if self.min >= x:
            self.min = x
            self.min_list.append(self.min)
        return

    def pop(self):
        pop_result = None
        if self.stack_list:
            pop_result = self.stack_list[-1]
            if self.stack_list.pop() == self.min:
                self.min_list.pop()
                if self.min_list:
                    self.min = self.min_list[-1]
                else:
                    self.min = None
            return pop_result
        else:
            self.min = None
            return pop_result

    def print_stack(self):
        print "stack---->", self.stack_list
        return

    def get_min(self):
        return self.min

参考:

https://www.cnblogs.com/baiyb/p/8443337.html

https://blog.csdn.net/qq_36528804/article/details/82929234

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值