LeetCode 155. Min Stack 题解

本文介绍了一种使用两个栈来实现带有获取最小值功能的数据结构的方法。主要思路是在保持一个普通栈的同时,维护另一个仅存放不升序元素的栈,以此来高效地获取最小值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  题目链接:点击打开链接

  思路:本题的push、pop、top都可以直接使用java自带的stack实现。关键在于如何实现getMin()方法。

             使用两个栈,第一个栈正常保存全部数据,第二个栈只保存数据中的“不升序”序列,这其中的奥妙需要自行体会一下.....



Java 参考代码如下:

import java.util.Stack;

public class MinStack {

	Stack<Integer> stack;
	Stack<Integer> minStack;

	/** initialize your data structure here. */
	public MinStack() {
		stack = new Stack<Integer>();
		minStack = new Stack<Integer>();
	}

	public void push(int x) {
		stack.push(x);
		// 第二个条件之所以是<= 而不是 <, 是因为对于push(0,3,0,2)  pop(2,0)这种情况,
		// 如果是<号,则获取最小值会出错
		if (minStack.isEmpty() || x <= minStack.peek()) {
			minStack.push(x);
		}
	}

	public void pop() {
		int popNum = stack.peek();
		if (!stack.isEmpty()) {
			stack.pop();
		}
		// 第二个判断条件,之所以是==而不是 <=,是因为stack.peek不可能比minStack.peek小,
		// 否则在该栈顶元素push入栈的时候,它就会被压到minStack的栈顶....
		if (!minStack.isEmpty() && popNum == minStack.peek()) {
			minStack.pop();
		}
	}

	public int top() {
		return stack.isEmpty()?0:stack.peek();
	}

	public int getMin() {
		return minStack.isEmpty()?0:minStack.peek();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值