LeetCode-剑指 Offer 30. 包含min函数的栈
原文链接:https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof
1. 问题描述
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.min(); --> 返回 -2.
提示: 各函数的调用总次数不超过 20000 次
2. 解析
通过上面的描述我觉得直接用O(1)能解决问题吗? 不得判断所有栈里面的数据从小到大排列一下。 后来看了题解才发现我理解错误了。 题目的要求就是压进去的数据顺序不变, 只是每次栈里面的最小数是有顺序的。 这里面不需要使用两个栈, 有一个最小值变量维护, 每次压进去保存最小值, 然后也把最小值压进去, 就是每次压进去两个值:最小值和当前值。 然后弹出的时候需要弹出两个值:当前值和最小值。 注意:压入最小值和当前值的顺序不能变!
3. 考答案
class MinStack {
private Stack<Integer> stack;
private Integer min = Integer.MAX_VALUE;
public MinStack() {
stack = new Stack<>();
}
public void push(int x) {
stack.push(min);
if (x < min) {
min = x;
}
stack.push(x);
}
public void pop() {
stack.pop();
min = stack.peek();
stack.pop();
}
public int top() {
return stack.peek();
}
public int min() {
return min;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String inputStr = scanner.next();
inputStr = inputStr.substring(1, inputStr.length() - 1).replaceAll("\"", "");
String[] commends = inputStr.split(",");
String valueStr = scanner.next();
valueStr = valueStr.substring(1, valueStr.length() - 1);
String[] values = valueStr.split(",");
MinStack minStack = null;
StringBuilder result = new StringBuilder();
result.append("[");
for (int i = 0; i < commends.length; i++) {
String commend = commends[i];
String value = values[i];
switch (commend) {
case "MinStack":
minStack = new MinStack();
result.append("null,");
break;
case "push":
String num = value.substring(1, value.length() - 1);
minStack.push(Integer.parseInt(num));
result.append("null,");
break;
case "min":
int min = minStack.min();
result.append(min+",");
break;
case "pop":
minStack.pop();
result.append("null,");
break;
case "top":
int top = minStack.top();
result.append(top+",");
break;
default:
}
}
String resultStr = result.substring(0, result.length() - 1);
System.out.println(resultStr+"]");
}
}
|