leetcode-包含main函数的栈

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。

拿到题目之后我的第一想法就是用一个普通的栈去实现push和pop的方法,至于min遍历一下不就好了,如果我的写法算及格60分,那么官方题解绝对能拿120分。

请看代码:

class MinStack {
        /** initialize your data structure here.  */
        val list = ArrayDeque()
        val list2 = ArrayDeque()
        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完成pushpoptop函数.
那么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,不是一直正常的解题逻辑,它属于经验,属于实践的总结

你可能感兴趣的:(leetcode-包含main函数的栈)