1.题目及链接
https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof/
2. 代码
class MinStack {
// 栈顶
private Node head;
public MinStack() {
}
public void push(int x) {
if (head == null) // 初始创建
head = new Node(x, x, null);
else // 头插法,每次都保存一个当前链表最小值
head = new Node(x, Math.min(head.min, x), head);
}
public void pop() {
// 移除头
head = head.next;
}
public int top() {
// peek操作
return head.val;
}
public int min() {
// 返回当前链表的最小值
return head.min;
}
private class Node {
int val;
int min;
Node next;
public Node(int val, int min, Node next) {
this.val = val;
this.min = min;
this.next = next;
}
}
}
3. 题解与要点
假设push该栈3个元素——2,3,1.
得到如下图结果:
要点梳理:
- 栈频繁操作表头(实现O(1)时间复杂度的关键)
- 空间换时间思想
- 当前状态和之前的状态进行区分