题目描述
设计一个支持 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.
解题思路
1.两个栈
一个栈用来存放正常的入栈出栈的值,另一个存储当前最小值
java代码如下:
import java.util.Stack;
class MinStack {
Stack stack = new Stack();
Stack minStack = new Stack();
int cur,curMin;
/** initialize your data structure here. */
public MinStack() {
}
public void push(int x) {
//或的顺序不可相反,否则会报栈空异常
if(minStack.isEmpty() || x <= (Integer)minStack.peek()){
//必须是x <= (Integer)minStack.peek()插入最小栈,因为可能会有重复元素
minStack.push(x);
}
stack.push(x);
}
public void pop() {
//if(!stack.isEmpty()) {
cur = (Integer) stack.peek();
if (cur == (Integer) minStack.peek()) {
minStack.pop();
}
stack.pop();
// }
}
public int top() {
return (Integer)stack.peek();
}
public int getMin() {
return (Integer)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.getMin();
*/
运行结果如下:

2.一个栈
如何保存之前的最小值呢?
在压入当前新的最小值元素之前压入之前的最小值;若这个元素不会造成最小值发生变化,只需要压入这个元素即可。
java代码如下:
import java.util.Stack;
class MinStack1 {
Stack stack = new Stack();
int cur;
int preMin = Integer.MAX_VALUE;
/** initialize your data structure here. */
public MinStack1() {
}
public void push(int x) {
if(x <= preMin){ //因为可能会有重复元素,若之前最小值为2,再次入一次2,则弹出这个2时更新的最小值可能为3
stack.push(preMin);
preMin = x;
}
stack.push(x);
}
public void pop() {
if((Integer)stack.peek() == preMin){ //如果待弹出元素即为最小值,则需要更新最小值,和弹出两次
stack.pop();
preMin = (Integer)stack.peek();
}
stack.pop();//如果待弹出元素不是最小值,则只需要弹出一次即可(之前进入也是只进这个元素的)
}
public int top() {
return (Integer)stack.peek();
}
public int getMin() {
return preMin; //preMin记录当前栈中最小值
}
}
/**
* 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.getMin();
*/
运行结果如下:

3.借鉴思路
直接用一个链表即可实现栈的基本功能,我们可以在 Node 节点中增加一个 min 字段,这样的话每次加入一个节点的时候,我们同时只要确定它的 min 值即可。
java代码如下:
class MinStack {
class Node{
int value;
int min;
Node next;
Node(int x, int min){
this.value=x;
this.min=min;
next = null;
}
}
Node head;
//每次加入的节点放到头部
public void push(int x) {
if(null==head){
head = new Node(x,x);
}else{
//当前值和之前头结点的最小值较小的做为当前的 min
Node n = new Node(x, Math.min(x,head.min));
n.next=head;
head=n;
}
}
public void pop() {
if(head!=null)
head =head.next;
}
public int top() {
if(head!=null)
return head.value;
return -1;
}
public int getMin() {
if(null!=head)
return head.min;
return -1;
}
}
作者:windliang
链接:https://leetcode-cn.com/problems/min-stack/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-38/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
运行结果如下:

本文介绍了一种设计支持push、pop、top及getMin操作的栈的方法,可在常数时间内检索到最小元素。通过使用双栈、单栈及链表三种方式实现,详细解释了每种方法的原理和代码实现。
368

被折叠的 条评论
为什么被折叠?



