【算法训练】剑指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]