设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) -- 将元素 x 推入栈中。
pop() -- 删除栈顶的元素。
top() -- 获取栈顶元素。
getMin() -- 检索栈中的最小元素。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
? https://leetcode-cn.com/problems/min-stack
思路: 就是照着栈的结构来,pop(),push(),top(),getMin()
1. 难写的在于getMin()函数,返回当前栈中的最小元素,由于可能连续pop()然后getMin()所以用一个变量记住栈中最小值的方式是不行的,因为在不断的pop()过程中,栈中的最小值是会变化的.
解决这个问题就是再开一个list:a,保存从开头到下标索引为i的元素之间的最小元素保存至a[i],这样就解决的getMin()函数的写法
2. 此外我还发现了一个python中list的易错点:
刚开始的时候,我想通过list[idx] = x 的方式在list列表中索引为idx的位置插入一个新的元素,其数值为x,但是这样会报数组下标越界的错误.
原因是:在python中list想要增加元素的话,是不可以通过 list[idx] = x 的方式来增加新元素的,可行的方式是利用append(),insert()两函数来增加元素.
list[idx] = x 的方式只能用于修改索引下标为idx的元素的值,也就是意味着只能修改已经存在了的元素的值。
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self.nums = []
self.pre_min = []
self.idx = 0
def push(self, x: int) -> None:
if self.idx > 0: # 分两种情况: 1. 栈中已经存在元素了 2. 栈中不存在元素
self.nums.append(x)
if self.pre_min[self.idx - 1] >= x:
self.pre_min.append(x)
else:
t = self.pre_min[self.idx - 1]
self.pre_min.append(t)
else:
self.nums.append(x)
self.pre_min.append(x)
self.idx += 1
def pop(self) -> None:
self.nums.pop(-1)
self.pre_min.pop(-1)
self.idx -= 1
def top(self) -> int:
return self.nums[self.idx - 1]
def getMin(self) -> int:
return self.pre_min[self.idx - 1]
# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(x)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()