1、题目描述
【JZ20】定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
知识点:栈
难度:☆
2、解题思路
定义一个辅助栈,辅助栈的元素个数和主栈一直。
push(3) ,此时两个栈都为空,直接入栈:
push(1),主栈直接入栈,辅助栈判断 1<3 ,于是入栈:
push(2),主栈入栈,辅助栈判断 2>1,于是重复自己的栈顶入栈:
push(4),主栈入栈,辅助栈判断 4>1 ,于是重复自己的栈顶入栈:
于是,辅助栈顶永远是主栈的最小值。
3、解题代码
package pers.klb.jzoffer.hard;
import java.util.Stack;
/**
* @program: JzOffer2021
* @description: 包含min函数的栈
* @author: Meumax
* @create: 2020-08-12 10:35
**/
public class StackIncludeMin {
private Stack<Integer> stack = new Stack<>();
private Stack<Integer> minStack = new Stack<>();
public void push(int node) {
if (stack.isEmpty()) {
minStack.push(node);
} else {
if (node < minStack.peek()) {
minStack.push(node);
} else {
minStack.push(minStack.peek());
}
}
stack.push(node);
}
public void pop() {
stack.pop();
minStack.pop();
}
public int top() {
return stack.peek();
}
public int min() {
return minStack.peek();
}
}
时间复杂度:O(1)
空间复杂度:O(n), 开辟了一个辅助栈。
4、解题心得
一开始是想着定义一个私有变量,每当入栈一个元素,就判断更新一次最小值,忽略了当出栈后,可能导致最小值丢失的问题。
利用辅助栈可以解决出栈后最小值丢失的问题,因为最小值一直都在辅助栈里面。