题目描述
// 力扣
// 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的
// min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
// 牛客
// 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的
// min函数(时间复杂度应为O(1))。
题解
// 这题要求O(1)复杂度,遍历数据结构的所有位置找最小值肯定是不可能的,
// 这就需要新创建一个栈minstack用于专门存储push进栈A的最小的值,
// 并且把最小值一直置于minstack的栈顶,这样需要的时候直接弹出就是O(1)
// 复杂度了。
// 总的来说,minstack只用于存储最小或曾经的最小值,如果minstack
// 为空,push时直接压进去,如果minstack非空,则push之前先判断压入元素
// 与minstack栈顶元素谁比较小,取小的那个数压入。
// (如果压入元素不比minstack栈顶元素小也没关系,这样会重新压一个
// minstack栈顶元素进去,保证了minstack和dataStack两个栈的长度一致)
// 牛客
// 运行时间:11ms
// 占用内存:9796k
import java.util.Stack;
public class Solution {
private Stack<Integer> minStack = new Stack<>();
private Stack<Integer> dataStack = new Stack<>();
public void push(int node) {
if (minStack.isEmpty())
minStack.push(node);
else // 取minStack栈顶元素和压入元素最小的那个压入
minStack.push(Math.min(minStack.peek(), node));
dataStack.push(node);
}
public void pop() {
dataStack.pop();
minStack.pop();
}
public int top() {
return dataStack.peek();
}
public int min() {
return minStack.peek();
}
}
// 力扣
// 执行用时:21 ms, 在所有 Java 提交中击败了85.37%的用户
// 内存消耗:40.3 MB, 在所有 Java 提交中击败了61.41%的用户
import java.util.Stack;
class MinStack {
private Stack<Integer> minStack;
private Stack<Integer> dataStack;
/** initialize your data structure here. */
public MinStack() {
minStack = new Stack<>();
dataStack = new Stack<>();
}
public void push(int x) {
if (minStack.isEmpty())
minStack.push(x);
else {
minStack.push(Math.min(minStack.peek(), x));
}
dataStack.push(x);
}
public void pop() {
dataStack.pop();
minStack.pop();
}
public int top() {
return dataStack.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();
*/