题干:
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
思路:
思路,一开始想着是压根不用栈,直接利用集合模拟栈这种数据结构的pop、push、top,最后再利用Collections工具类进行sort排序,输出第一个值即可。不过这样存在一个问题,时间复杂度太高了,Collection.sort的时间复杂度在O(n2)以上。那么改变思路,用两个栈来实现该算法功能:
1.两个栈一个正常存放数据,另一个存放最小值;
2.存放最小值的栈内数据的数量和另一个栈要保持一致;
3.存放最小值的栈的数据更新策略为:
(1)为空时直接和另一个栈添加一样的数据;
(2)不为空时,如果node比栈顶元素小,那么添加node,反之添加原栈顶元素。
具体解法如下:
import java.util.Stack;
public class Solution {
Stack<Integer> stack = new Stack<>();
Stack<Integer> stackmin = new Stack<>();
public void push(int node) {
stack.push(node);
if(stackmin.empty()){
stackmin.push(node);
}
else {
if(stackmin.peek()>node){
stackmin.push(node);
}
else {
stackmin.push(stackmin.peek());
}
}
}
public void pop() {
stack.pop();
stackmin.pop();
}
public int top() {
return stack.peek();
}
public int min() {
return stackmin.peek();
}
}