【算法训练】剑指offer#30 包含min函数的栈

一、描述

包含min函数的栈

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 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.

二、思路

  • 每次top和min时,遍历一遍stack找到目标值
  class MinStack:
  
      def __init__(self):
          self.stack_value = []
          self.reverse = False
  
  
      def push(self, x: int) -> None:
          self.stack_value.append(x)
  
  
      def pop(self) -> None:
          if self.reverse:
              self.stack_value.pop(0)
          else:
              self.stack_value.pop()
  
      def top(self) -> int:
          if self.reverse:
              return self.stack_value[0]
          else:
              return self.stack_value[-1]
  
      def min(self) -> int:
          self.reverse = not self.reverse
          if not self.stack_value:
              return
          min_value = self.stack_value[0]
          temp_stack = []
          while self.stack_value:
              temp_value = self.stack_value.pop()
              if temp_value < min_value:
                  min_value = temp_value
  
              temp_stack.append(temp_value)
          self.stack_value = temp_stack
          return min_value

显而易见不大行,这样子反转后再添加元素就会头尾颠倒,并且时间复杂度也不行

  • 采用a和b两个栈,a栈正常push元素,b栈在push过程中降序存储

三、解题

class MinStack:

    def __init__(self):
        self.stack_a = []
        self.stack_b = []


    def push(self, x: int) -> None:
        self.stack_a.append(x)
        if not self.stack_b:
            self.stack_b.append(x)
        else:
            if not ( x > self.stack_b[-1]):
                self.stack_b.append(x)


    def pop(self) -> None:
        value = self.stack_a.pop()
        if value == self.stack_b[-1]:
            self.stack_b.pop()

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

    def min(self) -> int:
        return self.stack_b[-1]
posted @ 2022-01-18 19:25  小拳头呀  阅读(29)  评论(0编辑  收藏  举报