刷题使我快乐,满脸开心.jpg
- 来源:力扣(LeetCode)
- 链接:https://leetcode.cn/problems/min-stack/
- 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目
设计一个支持 push
,pop
,top
操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack
类:
MinStack()
初始化堆栈对象。void push(int val)
将元素val推入堆栈。void pop()
删除堆栈顶部的元素。int top()
获取堆栈顶部的元素。int getMin()
获取堆栈中的最小元素。
示例 1:
输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]
输出:
[null,null,null,null,-3,null,0,-2]
解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
提示:
-231 <= val <= 231 - 1
pop
、top
和getMin
操作总是在非空栈
上调用push
,pop
,top
, andgetMin
最多被调用3 * 104
次
思路
最大的问题就在于删除元素时对于最小位置的记录问题,所以这里用了一个额外的数组来记录,只是去除元素时需要注意,需要把之前可能已经出栈的元素都去掉
至此,上代码~
代码
type MinStack struct {
v []int
min []int
}
func Constructor() MinStack {
return MinStack{
v: make([]int, 0),
min: make([]int, 0),
}
}
func (this *MinStack) Push(val int) {
this.v = append(this.v, val)
if len(this.min) <= 0 {
this.min = append(this.min, 0)
} else if val < this.v[this.min[len(this.min)-1]] {
this.min = append(this.min, len(this.v)-1)
} else {
this.min = append(this.min, this.min[len(this.min)-1])
}
}
func (this *MinStack) Pop() {
for ;len(this.min) > 0 && this.min[len(this.min)-1] >= len(this.v)-1; {
this.min = this.min[:len(this.min)-1]
}
this.v = this.v[:len(this.v)-1]
}
func (this *MinStack) Top() int {
return this.v[len(this.v)-1]
}
func (this *MinStack) GetMin() int {
return this.v[this.min[len(this.min)-1]]
}