[力扣] 剑指 Offer 第一天 - 包含 min 函数的栈
耐心和持久胜过激烈和狂热。
题目来源
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/bao-han-minhan-shu-de-zhan-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
示例 1
题目分析
栈的特点是后进先出,在 Go 语言里面可以使用切片实现栈。根据题意,结构体里不仅要定义一个栈变量 stack
去保存元素,还需要另一个栈 minStack
,去维护 stack
里的最小元素,minStack
入栈条件是该元素小于或等于栈顶元素,这样一来最小的元素都会处于栈顶位置,而最小元素出栈的时机是当 stack
出栈的元素等于 minStack
的栈顶元素。
解题思路
对于入栈方法
push
先将元素
val
压入stack
。然后判断
minStack
是否为空或val
元素是否小于等于minStack
的栈顶元素,条件成立则将val
压入minStack
。利用切片的特点,入栈通过
append
方法进行。对于出栈方法
pop
将
stack
栈顶元素进行出栈,通过切片截取的方法,截取除了最后一个元素以外的区间,然后重新赋值给原切片,达到删除栈顶元素的效果。然后判断被删除元素是否等于
minStack
栈顶元素,条件成立则minStack
执行出栈操作
以下通过文字演示 stack
和 minStack
元素变化的过程
代码实现
执行结果
复杂度分析
时间复杂度:push
方法时间复杂度为 O(1),pop
方法时间复杂度 O(1),都是常量级操作,最多调用栈操作两次。
空间复杂度:O(n),其中 n 为总操作数。最坏情况下,stack
会连续压入 n 个元素,此时 stack
占用的空间为 O(n)。
总结
以上是本人的解法,如果对你有帮助,欢迎点赞收藏加关注,如果有错误的地方,欢迎指正!
版权声明: 本文为 InfoQ 作者【陈明勇】的原创文章。
原文链接:【http://xie.infoq.cn/article/f05ccf0ab04295539b5f68e5f】。文章转载请联系作者。
评论