LeetCode刷题-155.最小栈(hot100)

10 篇文章 0 订阅
6 篇文章 0 订阅

✨hot100-- 155.最小栈✨

力扣C++打卡!✊✊✊🌈大家好!本篇文章将继续介绍关于栈的OJ题,题目来自力扣:hot100-- 155.最小栈,展示代码语言暂时为:C++代码 😇。


🔒1、题目:

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack 类:
MinStack() 初始化堆栈对象。
void push(int val) 将元素val推入堆栈。
void pop() 删除堆栈顶部的元素。
int top() 获取堆栈顶部的元素。
int getMin() 获取堆栈中的最小元素。
🌲 示例 1🌲:

	输入:
	["MinStack","push","push","push","getMin","pop","top","getMin"]
	[[],[-2],[0],[-3],[],[],[],[]]
	
	输出:
	[null,null,null,null,-3,null,0,-2]
	
	解释:
	MinStack minStack = new MinStack();
	minStack.push(-2);
	minStack.push(0);
	minStack.push(-3);
	minStack.getMin();   --> 返回 -3.
	minStack.pop();
	minStack.top();      --> 返回 0.
	minStack.getMin();   --> 返回 -2.

❗️ 提示 ❗️ :

	-2^31 <= val <= 2^31 - 1
	pop、top 和 getMin 操作总是在 非空栈 上调用
	push, pop, top, and getMin最多被调用 3*10^4 次

来源:力扣(LeetCode)👈
链接:https://leetcode.cn/problems/min-stack/

☀️2、思路:

3种做法:

  1. 利用一个辅助栈来存放最小值
  2. 将当前值和最小值当成一个元组,直接存放在栈中
  3. 定义下最小值,栈中存放元素与最小值之间的差值,若为正值,弹出和取栈顶值时利用最小值还原;若为负值,弹出时需先还原原先的最小值,然后弹出。
🔑3、代码:

方法一:

		//辅助栈存放最小值
		class MinStack {
		    stack<int> x_st;
		    stack<int> min_st;
		public:
		    MinStack() {
		        min_st.push(INT_MAX);
		    }
		    
		    void push(int val) {
		        x_st.push(val);
		        min_st.push(min(val,min_stack.top()));
		    }
		    
		    void pop() {
		        x_st.pop();
		        min_st.pop();
		    }
		    
		    int top() {
		        return x_st.top();
		    }
		    
		    int getMin() {
		        return min_st.top();
		    }
		};

方法二:

	//一个栈,保存元组(当前值val,栈内最小值), 同时进栈出栈
	class MinStack {
	private:
	    stack<pair<int, int>> st;
	public:
	    /** initialize your data structure here. */
	    MinStack() {
	    }
	
	    void push(int val) {
	        if (st.size() == 0) {
	            st.push({val, val});
	        } else {
	            st.push({val, min(val, st.top().second)});
	        }
	    }
	    
	    void pop() {
	        st.pop();
	    }
	    
	    int top() {
	        return st.top().first;
	    }
	    
	    int getMin() {
	        return st.top().second;
	    }
	};

方法三:

	//不用辅助栈
	class MinStack {
	private:
	    stack<long long> st; //存储入栈的元素
	    long long minVal =0; //当前最小值
	public:
	    /** initialize your data structure here. */
	    MinStack() {
	    }
	
	    void push(int val) {
	        if (st.size() == 0) {
	            st.emplace(0LL); //栈内无元素时,存放差值0
	            minVal = val; //当前入站元素为最小值
	        } else {
	            st.emplace((long long)val - minVal); //记录当前元素与最小值的差值
	            minVal =min(minVal, (long long)val); //更新最小值 
	        }
	    }
	    
	    void pop() {
	        //栈顶元素为正值,直接弹出,若为负值,表明在这个为最小值发生改变,需要还原
	        minVal -= min(st.top(), 0LL);
	        st.pop();
	    }
	    
	    int top() {
	        //用最小值还原栈顶元素
	        return (int)(minVal + max(st.top(), 0LL));
	    }
	    
	    int getMin() {
	        return (int)minVal;
	    }
	};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

君莫笑lucky

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

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

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

打赏作者

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

抵扣说明:

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

余额充值