今日第二道题,一道我没怎么读懂题意的题。上题:
题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。
附上解释:
输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]
输出:
[null,null,null,null,-3,null,0,-2]
解释:
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还是pop能第一时间知道栈中元素的最小值。
题目要求时间为1,一看这题也不像是很简单的模样,毕竟栈不像数组可以为所以为,所以我们只能牺牲空间换时间,找一个min栈,用来存放本栈任意操作后的栈中最小值,是不是让我说晕了,看代码:
代码:
import java.util.Stack;
public class Solution {
Stack<Integer> stack = new Stack<>();
Stack<Integer> minstack = new Stack<>(); //定义一个辅助栈,存放任意时刻最小值;
public void push(int node) {
stack.push(node);
if((minstack.isEmpty())||(node<minstack.peek())){//min栈空或栈中元素比输入大,入栈
minstack.push(node);
}else if(node>=minstack.peek()){
minstack.push(minstack.peek()); //如果输入元素比栈中大,则复制一遍栈顶元素;
}
}
public void pop() {
stack.pop();
minstack.pop();
}
public int top() {
return stack.peek();
}
public int min() {
return minstack.peek(); //你只能返回,不能pop,因为有专门的pop,只有stack pop了,min栈才有权利pop
}
}
牛客运行通过
运行时间:16ms
运行内存:9552Kb
这个题一开始我是真的没有搞懂,知道去leedco看了解析才懂,实名表扬leedcode的示例,剑指你也跟上啊~~
欢迎各位互相学习和交流哦~~