剑指offer面试题21 包含min函数的栈

考察点

java 复制代码
双栈

知识点

题目

分析

题目需要一个能够得到栈的最小元素的min函数,并且min函数,pop,push都要求是O(1)的时间复杂度。遇到栈思维要往双栈上考虑,这种情况一个栈肯定完成不了,需要一个辅助栈,既然要求 O(1)时间内拿到最小元素,那么这个辅助栈的栈顶存的肯定是当前所有元素中最小的元素,所以只要每次入栈的时候取当前元素和辅助栈顶层数据最小值入栈即可。切记注意辅助栈需要和数据栈一起增长,这样当数据栈弹出的时候辅助栈的栈顶数据依然是所有元素中最小的元素

java 复制代码
import java.util.Deque;
import java.util.LinkedList;

public class Stack {
	private Deque stack;
	private Deque minStack;

	public Stack() {
		stack = new LinkedList<>();
		minStack = new LinkedList<>();
	}
	public void push(int val) {
		stack.push(val);
		if (minStack.peek() == null){
			minStack.push(val);
			return;
		}
		int peekData = (int) minStack.peek();
		if (peekData > val) {
			minStack.push(val);
		} else {
			minStack.push(peekData);
		}
	}
	public void pop() {
		if (minStack.peek() == null) {
			throw new Error("stack empty");
		}
		minStack.pop();
		stack.pop();
	}
	public int min() {
		if (minStack.peek() == null) {
			throw new Error("stack empty");
		}
		int peekData = (int) minStack.peek();
		return peekData;
	}
}
public class TwentyOne {
	public static void main(String[] args) {
		Stack stack = new Stack();
		stack.push(3);
		System.out.println(stack.min());
		stack.push(4);
		System.out.println(stack.min());
		stack.push(2);
		System.out.println(stack.min());
		stack.push(1);
		System.out.println(stack.min());
		stack.pop();
		System.out.println(stack.min());
		stack.pop();
		System.out.println(stack.min());
		stack.push(0);
		System.out.println(stack.min());
	}
}
相关推荐
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ4 分钟前
EasyExcel中AnalysisEventListener<T>抽象类的方法执行顺序
java
handler015 分钟前
算法:查并集
开发语言·数据结构·c++·笔记·学习·算法·c
plus4s5 分钟前
3月19日(进阶10)
算法
雨落在了我的手上6 分钟前
C语言之数据结构初见篇(5):单链表的介绍(1)
c语言·开发语言·数据结构
Trouvaille ~9 分钟前
【优选算法篇】快速排序模型——从数组划分到快速选择
算法·leetcode·青少年编程·面试·蓝桥杯·快速排序·基础入门
Wect10 分钟前
LeetCode 918. 环形子数组的最大和:两种解法详解
前端·算法·typescript
悟空码字12 分钟前
别再让你的SpringBoot包"虚胖"了!这份瘦身攻略请收好
java·spring boot·后端
szm022514 分钟前
操作系统-
java·linux·服务器
圣保罗的大教堂16 分钟前
leetcode 3212. 统计 X 和 Y 频数相等的子矩阵数量 中等
leetcode
进击的cc17 分钟前
彻底搞懂 Binder:不止是 IPC,更是 Android 的灵魂
android·面试