题目
最小栈
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) -- 将元素 x 推入栈中。
pop() -- 删除栈顶的元素。
top() -- 获取栈顶元素。
getMin() -- 检索栈中的最小元素。
思路
- 最先的思路是使用 List 作为模拟栈的容器,通过使用 index 角标记录入栈出栈的位置,每次栈元素变化重新定位最小值 min,代码提交执行9ms
- 题解最快是使用双向链表做,看一下思路,确实快,原因在于节点按顺序存储了当前值与最小值,每次入栈出栈操后不涉及额外的定位最小值,示意
node(当前值,最小值)
:node(1,1)->node(2,1)->node(-1,-1)->node(-2,-2)
,
关键
node节点既存储当前值,又存储最小值,最小值随链表有序递减
代码
package leetcode.stack;
import java.util.ArrayList;
import java.util.List;
/**
* 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
* <p>
* push(x) -- 将元素 x 推入栈中。
* pop() -- 删除栈顶的元素。
* top() -- 获取栈顶元素。
* getMin() -- 检索栈中的最小元素。
* <p>
* 示例:
* MinStack minStack = new MinStack();
* minStack.push(-2);
* minStack.push(0);
* minStack.push(-3);
* minStack.getMin(); --> 返回 -3.
* minStack.pop();
* minStack.top(); --> 返回 0.
* minStack.getMin(); --> 返回 -2.
*/
class Node {
public Node pre;
public Node next;
public int value;
public int min;
}
class MinStack2 {
Node top = null;
/**
* initialize your data structure here.
*/
public MinStack2() {
}
public void push(int x) {
Node node = new Node();
node.value = x;
if (top == null) {
node.min = x;
} else {
if (top.min < x) {
node.min = top.min;
} else {
node.min = x;
}
}
node.pre = top;
top = node;
}
/**
* top永远指向栈顶
* 第一个 if 判断栈是不是已经空了,空栈就没有pre节点
* 第二个 if 判断栈是不是已经空了,不是空栈就删除next节点,断链
*/
public void pop() {
if (null != top) {
top = top.pre;
if (null != top) {
top.next = null;
}
}
}
public int top() {
if (null != top) {
return top.value;
} else {
return -1;
}
}
public int getMin() {
return top.min;
}
}
public class N155_2 {
public static void main(String[] args) {
MinStack2 minStack = new MinStack2();
minStack.push(2147483646);
minStack.push(2147483646);
minStack.push(2147483647);
System.out.println(minStack.top());
minStack.pop();
System.out.println(minStack.getMin());
minStack.pop();
System.out.println(minStack.getMin());
minStack.pop();
minStack.push(2147483647);
System.out.println(minStack.top());
System.out.println(minStack.getMin());
minStack.push(-2147483648);
System.out.println(minStack.top());
System.out.println(minStack.getMin());
minStack.pop();
System.out.println(minStack.getMin());
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。