0
点赞
收藏
分享

微信扫一扫

《剑指offer》之“包含min函数的栈”题解



题目:


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栈和数据栈的栈顶元素是否相等,相等则全部弹出,反之则只弹出数据栈中的元素。


图解:


压入数据:

《剑指offer》之“包含min函数的栈”题解_数据

弹出数据:

《剑指offer》之“包含min函数的栈”题解_剑指offer_02


代码:


算法:

/**
* @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~



举报

相关推荐

0 条评论