【基本数据结构】变形题:最小栈的最优解
本问题对应课程链接:剑指offer刷题第七期
要求:
1、请打卡你的解题代码,如果能简单说一下思路则简单说一下思路。
2、给出你代码所用的时间复杂度和空间复杂度
这是我在面试遇到的问题,大家可以想一想,如何实现时间和空间都是 O(1),核心突破口在于数值范围,有一定难度。
问题描述:
实现一个这样的栈,这个栈除了可以进行普通的push、pop操作以外,还可以进行getMin的操作,getMin方法被调用后,会返回当前栈的最小值。栈里面存放的都是 int 整数,并且数值的范围是 [-100000, 100000]。要求所有操作的时间复杂度是 O(1)。
附加:如果空间复杂度也能O(1)的话可加分
要求:时间+空间都是O(1)就当作选做吧,你可以说一说你的想法,让空间/尽可能小勒。
答案:明天给答案吧
要求:
1、请打卡你的解题代码,如果能简单说一下思路则简单说一下思路。
2、给出你代码所用的时间复杂度和空间复杂度
答案已经出来了,大家看这个文章解析:Shopee面试:最小栈的最优解
共以下 16 个回答
时间空间复杂度均为 O(1)。
stack保存当前最小值与x的差值。
为什么要这样做?相当于通过stack的值(放的差额)去间接保存上一个最小值的信息
当stack的值<0,说明当前元素就是最小值,当前元素的实际值=min
当stack的值>0,说明当前元素不是最小值,当前元素的实际值=min+stack值
思路:栈中存储的是差值,而不是元素本身,一个变量用来存储最小值。
时间复杂度:O(1)。
空间复杂度:O(1)。
方法 额外用一个值记录最小值,push时将差值push进stack,pop时将原有值还原,并且如果不是之前的最小值,就同时还原之前的最小值。
time O(1) space O(1)
与此同时 leetcode还有一个用链表的处理 还没完全理解 贴个链接
https://leetcode.com/problems/min-stack/solutions/49010/clean-6ms-java-solution/
参考评论区小伙伴的写法
关键在于记录栈中元素和最小值之间的关系,能够在弹出最小元素时回退到之前最小的元素
没有思路,这是我看的gpt的解法,基本和帅地给的一样,算是大彻大悟了 都是O(1)
待理解
关键在记录每个元素与最小值间的差值
“`c++sk;
class MinStack {
public:
/** initialize your data structure here. */
stack
long long minn;
MinStack() {
};
“`
时间复杂度:O(1)
额外空间复杂度:O(1)
看了文章的做法,妙啊!加上了top方法,用int跑力扣上的这道题好像会越界,改成了long
//gpt给出的答案,供学习参考
//差值编码法
class MinStack2 { stack; // 使用一个栈存储差值编码
Stack
long minnum; // 当前的最小值
思路:需要一个栈完成栈的常规操作和一个min变量记忆当前最小值,看了文章解析,手动模拟一下过程就懂了。