【基本数据结构】变形题:最小栈的最优解
本问题对应课程链接:剑指offer刷题第六期
要求:
1、请打卡你的解题代码,如果能简单说一下思路则简单说一下思路。
2、给出你代码所用的时间复杂度和空间复杂度
这是我在面试遇到的问题,大家可以想一想,如何实现时间和空间都是 O(1),核心突破口在于数值范围,有一定难度。
问题描述:
实现一个这样的栈,这个栈除了可以进行普通的push、pop操作以外,还可以进行getMin的操作,getMin方法被调用后,会返回当前栈的最小值。栈里面存放的都是 int 整数,并且数值的范围是 [-100000, 100000]。要求所有操作的时间复杂度是 O(1)。
附加:如果空间复杂度也能O(1)的话可加分
要求:时间+空间都是O(1)就当作选做吧,你可以说一说你的想法,让空间/尽可能小勒。
答案:明天给答案吧
要求:
1、请打卡你的解题代码,如果能简单说一下思路则简单说一下思路。
2、给出你代码所用的时间复杂度和空间复杂度
答案已经出来了,大家看这个文章解析:Shopee面试:最小栈的最优解
共以下 20 个回答
利用差值存入栈中可以保证O(1)的空间复杂度
def validateBookSequences(self, putIn: List[int], takeOut: List[int]) -> bool:
stack,i = [],0
for num in putIn:
stack.append(num)
while stack and stack[-1] takeOut[i]:
stack.pop()
i = i+1
通过辅助栈存储栈元素非严格从大到小排列元素
class MinStack:
# 1个栈,栈里只记录 cur-minNum,即存放每个数字和最小值的差
def init(self):
self.stack = []
self.root = -1
self.minNum = -1
def push(self, x: int) -> None:
if not self.stack:
self.stack.append(0)
self.root = x
self.minNum = x
else:
self.stack.append(x-self.minNum) #如果x<minNum,那么存入的是负数
if x < self.minNum:
self.minNum = x
def pop(self) -> None: #难点:如何找回前面记录的最小值
x = self.stack.pop()
# self.minNum = 原min + x
if x < 0:
self.minNum -= x
直接将最小值信息存到栈中,核心就是如何在最小值出栈后能合理更换最小值 通过存差的方式 差为负值则最小值更新 s1; s1;
class MinStack {
public:
/** initialize your data structure here. */
stack
int min;
MinStack() {
std::stack
min = 0;
};
/**
* 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->getMin();
*/
差值栈 pop和top方法返回的值无法保证正确
class MinStack { zhan;
Stack
Long minValue;
/** initialize your data structure here. */
public MinStack() {
zhan=new Stack<>();
}
}
维护一个记录当前插入值和最小值的差距值的栈,注意防止数据溢出
思路:参考解析,神奇
代码:
滴滴
class MinStack { stk1; stk2;
public:
stack
stack
/** initialize your data structure here. */
MinStack() {
}
};
时间O(1) 空间 O(n)
谢谢,获得新解法:时空复杂度都是O(1).
“`c++ st;
class MinStack {
private:
stack
int min;
public:
/** initialize your data structure here. */
MinStack() {
};
/**
* 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->getMin();
*/
“`
private Stack stack = new Stack ();
private int min;
时间复杂度:O(1)
空间复杂度:O(1)
class MinStack { s ;
//时空均为O1的解法
Stack
int min;
}
/**
* 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.getMin();
*/
使用差值栈,对存储的值的范围有要求
差值栈 防止数据溢出
差值栈
时空复杂度:O(1)