剑指offer 30 -包含main函数的栈 - python

92 阅读1分钟

题目描述:

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。

示例:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.min();   --> 返回 -2.

提示:各函数的调用总次数不超过 20000 次


辅助list法: 使用stack来构建栈,使用minNum来存放曾经出现过的最小的元素。

  • 入栈时将元素添加到stack中,如果入栈的元素小于minNum[-1],即当前最小的元素,则将其添加到minNum中
  • 出栈时,如果当前栈顶的元素等于当前最小元素,即minNum[-1],则需要从minNum中进行移除,然后再进行出栈
  • 栈中最小的元素即minNum[-1]
class MinStack:

    def __init__(self):
        """
        initialize your data structure here.
        """
        self.stack = []
        self.m = []


    def push(self, x: int) -> None:
        self.stack.append(x)

        if self.m == [] or x <= self.m[-1] :
            self.m.append(x)

    def pop(self) -> None:
        if self.stack == []:
            return None 
 
        if self.top() == self.m[-1]:
            self.m.pop()

        return self.stack.pop()

    def top(self) -> int:
        return self.stack[-1]

    def min(self) -> int:
        if self.stack == []: 
            return 0
        print(self.m)
        return self.m[-1]

索引法:设置一个变量表示当前栈中最小的元素对应的索引minNum

  • 入栈时,如果入栈的元素小于minNum指向的元素则更新minNum,否则不变
  • 出栈时,如果minNum指向的元素位于栈顶,首先找到除栈顶元素外的栈中最小元素的索引并更新minNum,否则直接出栈
  • 注意在入栈和出栈时都要更新栈中元素的数量
import sys
class MinStack:
    def __init__(self):
        self.stack = [sys.maxsize]
        self.minNum = 0
        self.num = 1

    def push(self, node):
        self.stack.append(node)
        self.num += 1
        if self.stack[self.num - 1] < self.stack[self.minNum]:
            self.minNum = self.num - 1

    def pop(self):
        if self.stack == []:
            return None
        
        if self.top() == self.stack[self.minNum]:
            self.minNum = self.stack.index(min(self.stack[:-1]))
            self.num -= 1
            return self.stack.pop()
        else:
            self.num -= 1
            return self.stack.pop()

    def top(self):

        return self.stack[len(self.stack) - 1]

    def min(self):
        if self.stack == []:
            return 0 
        else:
            return self.stack[self.minNum]