【数据结构专题】变形题:最小栈的最优解
本问题对应课程链接:剑指offer刷题第五期
这是我在面试遇到的问题,大家可以想一想,如何实现时间和空间都是 O(1),核心突破口在于数值范围,有一定难度。
问题描述:
实现一个这样的栈,这个栈除了可以进行普通的push、pop操作以外,还可以进行getMin的操作,getMin方法被调用后,会返回当前栈的最小值。栈里面存放的都是 int 整数,并且数值的范围是 [-100000, 100000]。要求所有操作的时间复杂度是 O(1)。
附加:如果空间复杂度也能O(1)的话可加分
要求:时间+空间都是O(1)就当作选做吧,你可以说一说你的想法,让空间/尽可能小勒。
要求:
1、请打卡你的解题代码,如果能简单说一下思路则简单说一下思路。
2、给出你代码所用的时间复杂度和空间复杂度
答案已经出来了,大家看这个文章解析:Shopee面试:最小栈的最优解
共以下 15 个回答
class MinStack {
public:
/** initialize your data structure here. */
MinStack() {
private: s1, s2;
stack
};
时间复杂度为O(1)
差值栈,注意数值范围的限制
参考大佬的思路,栈内存差值元素
//双栈加一个min——value;记录最小值,需要时调用;
差值栈,但要注意数值范围的限制
時間複雜度O(1)空間複雜度O(1)
利用push時儲存最小值和當前值的差值, 並且同步更新最小值來確保調用getmin函數時可以正確取得棧中的最小值
使用差值栈
用栈保存当前值与最小值的差值。如果当前值是最小值,更新最小值。
保存差值法,不需要使用额外的栈。
记录差值
1、一个栈实现
···java
class MinStack {
}
“`
// 单min变量法 s;
// 无辅助栈
// data = x – min
// if x < min:
// data = min – oldMin
// oldMin = min – data
class MinStack {
long min;
Stack
/** initialize your data structure here. */
public MinStack() {
s = new Stack<>();
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.min();
*/