最小栈
1、题目
2、题解
最小插值法
当元素入栈时,只要没有加入更小值时,当前最小值是保持不变的。我们可以改变入栈元素内容,将当前入栈值与最小值插值入栈,这样可以根据最小值还原栈内值。
这样有一个新问题:最小值不是一直不变,当有更小值入栈时,最小值就会改变,原来记录的差值就不对了。
当更小值入栈,插值小于0,而之前的插值都是大于等于0。因此可以根据负数插值作为一个判断,表示再这个时候发生了最小值的改变。只有在元素出栈的时候才可能需要还原最小值,还原的最小值就是\(当前最小值-插值\)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| class MinStack:
def __init__(self): self.diffs = [] self.min_val = 0
def push(self, val: int) -> None: if not self.diffs: self.diffs.append(0) self.min_val = val else: self.diffs.append(val - self.min_val) self.min_val = min(val, self.min_val)
def pop(self) -> None: self.min_val -= min(self.diffs.pop(),0)
def top(self) -> int: return self.min_val + max(self.diffs[-1], 0)
def getMin(self) -> int: return self.min_val
|