题目:
https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof/
解题思路:
题目要求实现一个包含min()函数的栈,min()函数的作用是返回栈中的最小值,因此我们可以想到使用一个辅助的数据结构来进行实现
。
首先我们想到的是一个小根堆或者是一个排序的List
,但是题目的要求是时间复杂度为O(1)
,这就排除了大多数的解决办法了。
想到时间复杂度为O(1),想必大多数同学都会想到用HashMap
,但是再看看案例,再删除一个最小值时还要重新寻找最小值,不可能把Map按从小到大排列吧,因此又排除了Map实现。
但是除了Map的时间复杂度为O(1),还有其他的数据结构,比如队列、栈
。
首先看队列,先进先出,我们不能预知先进的一定是最小的,进而先出的也不一定是最小的,因此排除队列
。
接下来只剩栈了,后进先出,我们可以决定后进的一定比先进的小,因此我们就能够实现先出的一定是最小的,所以栈合适
!
综上,我们增加一个辅助的栈用来存储最小值,当判断压入的数据小于min栈的栈顶元素时,压入min栈一份,反之不压入,在弹出数据时进行判断min栈和数据栈的栈顶元素是否相等,相等则全部弹出,反之则只弹出数据栈中的元素。
图解:
压入数据:
弹出数据:
代码:
算法:
/**
* @desc: 包含min函数的栈
* @author: YanMingXin
* @create: 2021/8/26-15:48
**/
public class MinStack {
private Stack<Integer> stack;
private Stack<Integer> stack1;
/**
* initialize your data structure here.
*/
public MinStack() {
stack = new Stack<>();
stack1=new Stack<>();
}
public void push(int x) {
stack.push(x);
if (stack1.empty() || stack1.peek() >= x) {
stack1.add(x);
}
}
public void pop() {
if (stack.pop().equals(stack1.peek())) {
stack1.pop();
}
}
public int top() {
return stack.peek();
}
public int min() {
return stack1.peek();
}
}
测试:
public static void main(String[] args) {
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-2);
minStack.push(-3);
//--> 返回 -3.
System.out.println(minStack.min());
minStack.pop();
// --> 返回 0.
System.out.println(minStack.top());
//--> 返回 -2.
System.out.println(minStack.min());
}
over~