剑指offer 30 包含min函数的栈 LeetCode155
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min
函数在该栈中,调用 min、push
及 pop
的时间复杂度都是
O
(
1
)
O(1)
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.
提示:
各函数的调用总次数不超过 20000
次
注意:
本题与主站 155 题相同:https://leetcode-cn.com/problems/min-stack/
解题思路
使用一个额外的 minStack
作为辅助栈,栈顶元素为当前栈中最小的值。
在对栈进行 push
入栈和 pop
出栈操作时,同样需要对 minStack
进行入栈出栈操作,从而使 minStack
栈顶元素一直为当前栈中最小的值。在进行 push
操作时,需要比较入栈元素和当前栈中最小值,将值较小的元素 push
到 minStack
中。
Java代码
class MinStack {
Stack<Integer> stack;//实际数据栈
Stack<Integer> minStack;//辅助栈,栈顶一直存储当前最小元素,数据个数和实际数据栈中个数一致
/** initialize your data structure here. */
public MinStack() {
stack = new Stack<>();
minStack = new Stack<>();
}
public void push(int x) {
stack.push(x);
//辅助栈为空或者当前入栈元素小于之前的最小值,说明当前元素就是最小值
if(minStack.isEmpty() || x < minStack.peek()){
minStack.push(x);
}else{//辅助栈顶元素仍然是最小的,让他再次入栈
int temp = minStack.peek();
minStack.push(temp);
}
}
public void pop() {
stack.pop();
//数据栈弹出了一个元素,辅助栈相应弹出一个元素
minStack.pop();
}
public int top() {
return stack.peek();
}
public int min() {
return minStack.peek();
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.min();
*/
Go代码
type MinStack struct {
Main []int
Help []int // 用于存最小值
}
func Constructor() MinStack {
return MinStack{
Main : make([]int,0),
Help : make([]int,0),
}
}
func (this *MinStack) Push(val int) {
// 主栈随时添加
this.Main = append(this.Main,val)
// 辅助栈为空时直接添加,不为空的时候,比较val和辅助栈栈顶的元素大小再决定添加哪个
if len(this.Help) == 0 {
this.Help = append(this.Help,val)
return
}
// 上面过了之后,说明辅助栈不为空,可以取下标了,没有上面的判断的话,这里可能去切片-1索引,报索引越界异常
min := this.Help[len(this.Help) - 1]
if val < min {
this.Help = append(this.Help,val)
} else {
this.Help = append(this.Help,min)
}
}
func (this *MinStack) Pop() {
this.Main = this.Main[0:len(this.Main) - 1]
this.Help = this.Help[0:len(this.Help) - 1]
}
func (this *MinStack) Top() int {
return this.Main[len(this.Main) - 1]
}
func (this *MinStack) GetMin() int {
return this.Help[len(this.Help) - 1]
}
/**
* Your MinStack object will be instantiated and called as such:
* obj := Constructor();
* obj.Push(val);
* obj.Pop();
* param_3 := obj.Top();
* param_4 := obj.GetMin();
*/