Leetcode刷题 栈中最小元素
Leetcode-简单-第155题
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) —— 将元素 x 推入栈中。
pop() —— 删除栈顶的元素。
top() —— 获取栈顶元素。
getMin() —— 检索栈中的最小元素。
其中前面3个函数还是非常的简单,可以用常规的数组就可以实现。
主要思考的是第4个函数getMin() —— 检索栈中的最小元素
。
如果不考虑任何的时间复杂度和空间复杂度,我们可以直接通过最常用的方式,找出数组中最小的元素返回。但是算法要求能在常数时间内检索到最小元素的栈
,也就是时间复杂度是O(1)。
解题思路
我们先复习下栈的特性
- 先进后出
- 对于栈来说,如果一个元素
a
在入栈时,栈里有其它的元素b, c, d
,那么无论这个栈在之后经历了什么操作,只要a
在栈中,b, c, d
就一定在栈中,因为在a
被弹出之前,b, c, d
不会被弹出
解题方法我们可以采用双栈方式,一个栈存储正常元素,一个栈存储最小元素。 参考如下:
class MinStack {
var stackList:[Int]
var minStackList:[Int]
/** initialize your data structure here. */
init() {
stackList = []
minStackList = []
}
func push(_ x: Int) {
stackList.append(x)
if let lastMin = minStackList.last{
minStackList.append(min(x, lastMin))
}else{
minStackList.append(x)
}
}
func pop() {
stackList.removeLast()
minStackList.removeLast()
}
func top() -> Int {
return stackList.last!
}
func getMin() -> Int {
return minStackList.last!
}
}