定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
拿到题目之后我的第一想法就是用一个普通的栈去实现push和pop的方法,至于min遍历一下不就好了,如果我的写法算及格60分,那么官方题解绝对能拿120分。
请看代码:
class MinStack {
/** initialize your data structure here. */
val list = ArrayDeque<Int>()
val list2 = ArrayDeque<Int>()
fun push(x: Int) {
list.push(x)
if (list2.isEmpty()||list2.peek()>=x){
list2.push(x)
}
}
fun pop() {
val a=list.pop()
if (a == list2.peek()){
list2.pop()
}
}
fun top(): Int {
return list.peek()
}
fun min(): Int {
return list2.peek()
}
}
list很好理解,就是简单的利用ArrayDeque
完成push
、pop
、top
函数.
那么list2到底是个啥啊!根本看不懂啊!
min函数直接取list2的栈顶?
不用想了,不结合实例,99%的人都想不明白
上实例:
1、先push一个数组
val mins=MinStack()
mins.apply {
push(-10)
push(14)
push(-20)
push(10)
push(-17)
}
从第一段代码中的push
函数我们可以看到,当list2为空或者list2的栈顶元素大于当前push的元素时添加当前元素。
所以list2在经历步骤1之后应该是这样的[-10、-20]
有人不经会想大于list2的栈顶就不添加了吗?,这样不会有问题吗?,如果我把-20删了最小的数不应该是-17吗,而-17并没有被添加,这这这。。不对啊!(我一开始也是这么想的)
但是,什么情况下会删除-20呢?
必然是
pop()//-17
pop()//10
pop()//-20
要删除-20必定先删除在它后面压入的元素,-17早就不在了。所以前面的一路不存在了
那有人不经要说:那我把-17放到-20前面压入。
这样
真的
会出问题吗?
答案是:当然不会
如果我们的压入顺序是这样
mins.apply {
push(-10)
push(14)
push(-17)
push(-20)
push(10)
}
那么list2应该就是这样[-10,-17,-20]
,随着我们不断pop
pop()//10 list:[-10,14,-17,-20] list2:[-10,-17,-20]
pop()//-20 list:[-10,14,-17] list2:[-10,-17]
pop()//-17 list:[-10,14] list2:[-10]
pop()//14 list:[-10] list2:[-10]
pop()//-10 list:[] list2:[]
瞧,list2依然一直的正确完成它的指责
list2,不是一直正常的解题逻辑,它属于经验,属于实践的总结
网友评论