【基本数据结构】变形题:最小栈的最优解
本问题对应课程链接:剑指offer刷题第四期
要求:
1、请打卡你的解题代码,如果能简单说一下思路则简单说一下思路。
2、给出你代码所用的时间复杂度和空间复杂度
这是我在面试遇到的问题,大家可以想一想,如何实现时间和空间都是 O(1),核心突破口在于数值范围,有一定难度。
问题描述:
实现一个这样的栈,这个栈除了可以进行普通的push、pop操作以外,还可以进行getMin的操作,getMin方法被调用后,会返回当前栈的最小值。栈里面存放的都是 int 整数,并且数值的范围是 [-100000, 100000]。要求所有操作的时间复杂度是 O(1)。
附加:如果空间复杂度也能O(1)的话可加分
要求:时间+空间都是O(1)就当作选做吧,你可以说一说你的想法,让空间/尽可能小勒。
答案:明天给答案吧
要求:
1、请打卡你的解题代码,如果能简单说一下思路则简单说一下思路。
2、给出你代码所用的时间复杂度和空间复杂度
答案已经出来了,大家看这个文章解析:Shopee面试:最小栈的最优解
共以下 28 个回答
直接实现min函数的方式与剑指offer 30 一样,使用两个栈的方式来实现,时间复杂度为O(n)。
下面是代码
增加了一个pop()函数,可以实现剑指的第30题,但是剑指的val值应该是-231 <= val <= 231 – 1,所以最终无法通过所有测试用例。测试用例实现18/19.
已学习
打卡同第一题
class MinStack {
public:
stack s;
int min;
MinStack() {
}
void push(int val) {
if(s.empty())
{
min=val;
s.push(0);
}else
{
int t=val-min;// 可能会发生溢出
if(t<0)
{
min=val;
}
s.push(t);
}
}
void pop() {
int k=s.top();
if(k<0)
{
min=min-k;
}
s.pop();
}
int top() {
return s.top() < 0 ? min : s.top() + min;
}
int getMin() {
return min;
}
};
“`c++ s;
class MinStack {
public:
stack
int min;
MinStack() {
if(s.empty())
{
min=val;
s.push(0);
}else
{
int t=val-min;// 可能会发生溢出
if(t<0)
{
min=val;
}
s.push(t);
}
}
int k=s.top();
if(k<0)
{
min=min-k;
}
s.pop();
}
return s.top() < 0 ? min : s.top() + min;
}
return min;
}
};
“`
// 存储差值 差值 = 入值 – min 如果大于0 那么 min 不变 如果 <0 min 肯定要更新成 新入值 stack; ();
Stack
int min =0;
/** initialize your data structure here. */
public MinStack() {
stack =new Stack
}
}
使用差值法,用stack来记录差值,但是在lc中需要改为long,否则会溢出
最小栈的最优解
”’java
public class Solution{ stack = new Stack<>();
private Stack
private int min;
public void push(int x){
if(stack.isEmpty()){
min = x;
stack.push(0);
}else{
//计算差值
int compare = x – min;
stack.push(compare);
//如果差值小于0,则x为最小值,否则最小值不变
min = compare < 0 ? x: min;
}
}
public void pop(){
int top = stack.peek();
//top小于0,最小值也会被删除
min = top < 0 ? (min-top):min;
stack.pop();
}
public int getMin(){
return min;
}
}
”’
用插值法
在前面那道题贴过一次了,原来还有一个打卡。那就再贴一次,具体思路写在前面那题的打卡里了。
有点区别的是,这题规定了数据范围,int是够的,而LC那道会超范围,所以用了long,其它都差不多。
五
你都刷过的了,重复参加了哦
再刷一次嘿嘿
采用辅助变量来保证时间复杂度和空间复杂度都是O(1)
感觉这题和那个维护最小栈是把原来的空间O(N),通过差值变换成O(1) stack1; stack2;//栈顶元素维护最小值
下面是代码 在第一题的提交上 数值越界了,按理说数值有取值限制的话应该能过
class MinStack {
public:
/** initialize your data structure here. */
stack
stack
int minx=2147483647;
MinStack() {
};
class MinStack:
def init(self):
# 元素栈
self.stack = []
# 辅助栈
self.min_stack = []
代码
妙啊
在lc上跑有overflow的情况,所以改成 stack