美文网首页
leetcode-包含main函数的栈

leetcode-包含main函数的栈

作者: 王灵 | 来源:发表于2022-10-12 10:08 被阅读0次

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 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完成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函数的栈

    定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 p...

  • 包含main函数的栈

    题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。 分析: 发现现在的题目都有点言...

  • 【栈】包含min函数的栈

  • C程序基本知识

    (1)C程序是由函数构成的,一个C源程序至少仅且包含一个main函数,也可以包含一个main函数和若干个其他函数,...

  • 计应17-2吴凯琳

    #include/*包含头文件*/ int main() /*主函数 main*/ { printf("吴凯琳\n...

  • 计应17-2郭宗润

    #include/*包含头文件*/ int main() /*主函数 main*/ { printf("郭宗润\n...

  • 包含min函数的栈

    定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。

  • 包含 min 函数的栈

    题目要求:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数。在该栈中,调用 min、pu...

  • 包含Min函数的栈

    时间 2018/10/14?环境:牛客的编译环境?语言:JavaScript☕️难点:这道题的难点在于不能直接用一...

  • 包含min函数的栈

    题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。 ...

网友评论

      本文标题:leetcode-包含main函数的栈

      本文链接:https://www.haomeiwen.com/subject/nzdtzrtx.html