Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
题目来源:LeetCode-栈的最小值
请设计一个栈,除了常规栈支持的pop与push函数以外,还支持min函数,该函数返回栈元素中的最小值。执行push、pop和min操作的时间复杂度必须为O(1)。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
二、思路分析:
思路一: 在原本节点类内多写入一个节点备用
每次push时比较当前数据与目前最小值的比较,若为最小值则替换当前min节点,并将原来的min节点作为目前节点的nextmin
删除时若删除的是最小值则将min节点替换为min.nextmin即可,相当于保存了两条链,一条栈的链以及最小值的链。
思路二:
使用一个辅助栈,内部保存元素的个数和数据栈完全一样
辅助栈内部永远保存本次入栈的数为所有数据的最小值
三、AC 代码:
思路一:
class MinStack {
Node minNode;
Node firstNode;
Node nextNode;
class Node {
Node next, nextmin;
int x;
Node(int x) {
this.x = x;
}
}
public MinStack() {
Node first = null;
Node next = null;
Node min = null;
}
public void push(int x) {
Node tempNode = firstNode;
firstNode = new Node(x);
firstNode.next = tempNode;
if (minNode == null || minNode.x > firstNode.x) {
firstNode.nextmin = minNode;
minNode = firstNode;
}
}
public void pop() {
if (firstNode == minNode) minNode = firstNode.nextmin;
firstNode = firstNode.next;
}
public int top() {
return firstNode.x;
}
public int getMinNode() {
return minNode.x;
}
}
思路二:
class MinStack {
private Stack<Integer> dataStack = new Stack<>();
private Stack<Integer> minStack = new Stack<>();
public void push(int x) {
dataStack.push(x);
if (minStack.empty() || x < minStack.peek()) minStack.push(x);
else minStack.push(minStack.peek());
}
public void pop() {
dataStack.pop();
minStack.pop();
}
public int top() {
return dataStack.peek();
}
public int getMin() {
return minStack.peek();
}
}