🌈大家好!本篇文章将继续介绍关于栈队列堆的OJ题,题目来自力扣:剑指 Offer 30. 包含min函数的栈,展示代码语言暂时为:C++代码 😇。
今天继续力扣C++打卡(12.09)!✊✊✊
🔒1、题目:
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数。在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
🌲 示例 🌲:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.min(); --> 返回 -2.
❗️ 提示 ❗️ :
各函数的调用总次数不超过 20000 次
来源:力扣(LeetCode)👈
链接:https://leetcode.cn/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/description/?orderBy=most_votes
☀️2、思路:
题目要求实现一个能够得到栈的最小元素的 min 函数。
我们首先应了解,栈是后入先出,其只有一个出口。栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为。
故只要顶端元素存入后,栈里面的元素内容不会发生改变,故可以考虑在每想向栈中存放一个元素时,存入上一次的最小值和本次加入的元素。
其中上一次的最小值可以方便pop时,得到pop该值后的最小值。
实现流程:
1️⃣ 定义一个无穷大的数为最小值Min,创建一个stack容器s;
2️⃣ push某一元素时,先加入上一个最小值Min,然后通过if语句对Min进行更新,之后加入该元素;
3️⃣ pop时,先pop掉该元素,然后把Min更新为上一个最小值,之后pop该最小值;
4️⃣ top直接返回顶端元素即可,min返回存放的最小值Min。
复杂度分析:
⏳时间复杂度:对于题目中的所有操作,时间复杂度均为 O(1)。
🏠空间复杂度 O(N) :其中 n 为总操作数。最坏情况下,我们会连续插入 n 个元素,此时栈占用的空间为 O(n)。
🔑3、代码:
class MinStack {
public:
int Min=INT_MAX; //定义一个无穷大的数
stack <int> s;
MinStack() {
}
void push(int x) {
s.push(Min); //加入上一个最小值 方便pop时,直接得到去掉该元素后的最小值
if(x<Min) Min=x; //更新最小值
s.push(x); //加入该元素
}
void pop() {
s.pop(); //pop掉该元素
Min=s.top();// Min 为上一个最小值
s.pop(); // 将该最小值也pop掉
}
int top() {
return s.top();
}
int min() {
return Min;
}
};
再提供一下官方的解法,采用了两个栈来完成题目,一个栈用来存放数据,另一个栈用来存放每个元素对应的最小值。与本文类似,但实现上有所差别。代码如下:
class MinStack {
stack<int> x_stack;
stack<int> min_stack;
public:
MinStack() {
min_stack.push(INT_MAX);
}
void push(int x) {
x_stack.push(x);
min_stack.push(::min(min_stack.top(), x));
}
void pop() {
x_stack.pop();
min_stack.pop();
}
int top() {
return x_stack.top();
}
int min() {
return min_stack.top();
}
};
作者:力扣官方题解
来源:力扣(LeetCode)👈
链接:https://leetcode.cn/problems/bao-han-minhan-shu-de-zhan-lcof/solutions/1398785/bao-han-minhan-shu-de-zhan-by-leetcode-s-i2fk/
🐾4、总结
🌈重点要清楚顶端元素存入后,栈里面的元素内容不会发生改变,故可以考虑在每想存放一个元素时,存入上一次的最小值和本次加入的元素。**其中上一次的最小值可以方便pop时,得到pop该值后的最小值。**这样就能较容易地完成本题.
🕊小伙伴们,明天俺要去考六级了,希望一次过🙏🙏。明天争取晚上更,当然也有可能断更🙄🕊
🚀🚀觉得文章写得不错的老铁们,点赞评论关注走一波!谢谢啦🙏 🙏🙌 !