LeetCode HOT 100 —— 155.最小栈

题目

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:
MinStack() 初始化堆栈对象。
void push(int val) 将元素val推入堆栈。
void pop() 删除堆栈顶部的元素。
int top() 获取堆栈顶部的元素。
int getMin() 获取堆栈中的最小元素。
在这里插入图片描述

思路

辅助栈的思想:

使用两个栈,在每个元素入栈的时候,在另一个辅助栈中存储当前元素栈内的最小值

即使用一个辅助栈,与元素栈同步插入和删除,用于存储与每个元素的对应的最小值

  • 当一个元素要入栈时,取当前辅助栈的栈顶元素(也就是存储的目前元素栈内的最小值),来即将入元素栈的元素进行对比,得出最小值,并插入辅助栈中
  • 当一个元素要出栈时,把辅助栈的栈顶元素也一同弹出
  • 在任意时刻,元素栈内元素的最小值就存储在辅助栈的栈顶元素中

java代码如下:

class MinStack {
	
	Deque<Integer> xStack;//元素栈
	Deque<Integer> minStack;//辅助栈	

    public MinStack() {
		xStack = new LinkedList<Integer>();
		minStack = new LinkedList<Integer>();
		minStack.push(Integer.MAX_VALUE);
    }
    
    public void push(int x) {
		xStack.push(x);
		minStack.push(Math.min(minStack.peek(),x));
    }
    
    public void pop() {
		xStack.pop();
		minStack.pop();
    }
    
    public int top() {
		return xStack.peek();
    }
    
    public int getMin() {
		return minStack.peek();
    }
}

——另外,如果不允许开辟额外空间的话,可以对辅助栈的思想进行改进:

即可以在一个栈中同时保存当前值和最小值。

可以用一个栈,同时保存入栈的值和入栈后的栈内最小值,即每次新元素x入栈时,保存的是一个元组:(当前值x,栈内最小值min),原值作为一个整体,同时出栈和入栈,即栈顶元素同时包含了当前值和栈内最小值

对于top()函数:获取栈顶元组第一个值,如a[0]
对于getMin()函数:获取栈顶元组第二个值,如a[1]
对于pop()函数:删除栈顶的元组

每次元素入栈的时候,比较当前新插入的元素x和当前栈内最小值(即栈顶元组的第二个值a[1])的大小

入栈:当栈为空,保存元素(x,x),当栈非空,保存元组(x,min(栈内最小值,x)
出栈:删除栈顶元组

java代码如下:

class MinStack {
	// 数组栈, [当前值, 当前最小值]
	private Stack<int[]> stack = new Stack<>();

	public MinStack(){}
	
	public void push(int x){
		if(stack.isEmpty()){
			stack.push(new int[]{x,x});
		} else {
			stack.push(new int[]{x,Math.min(x,stack.peek()[1])});
		}
	}
		
	public void pop(){
		stack.pop();
	}

	public int top(){
		return stack.peek()[0];
	}

	public int getMin(){
		return stack.peek()[1];
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HDU-五七小卡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值