• 【Leetcode】剑指Offer 30:包含min函数的栈


    定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
    示例:
    MinStack minStack = new MinStack();
    minStack.push(-2);
    minStack.push(0);
    minStack.push(-3);
    minStack.min(); --> 返回 -3.
    minStack.pop();
    minStack.top(); --> 返回 0.
    minStack.min(); --> 返回 -2.
    提示:
    各函数的调用总次数不超过 20000 次
    来源:力扣(LeetCode
    链接:https://leetcode.cn/problems/bao-han-minhan-shu-de-zhan-lcof
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    AC代码

    class MinStack:
    
        def __init__(self):
            """
            initialize your data structure here.
            """
            self.stack = []
            self.mins = []
    
        def push(self, x: int) -> None:
            self.stack.append(x)
            if self.mins == []:
                self.mins.append(x)
            else:
                temp = x if x < self.mins[-1] else self.mins[-1]
                self.mins.append(temp)
    
        def pop(self) -> None:
            self.stack.pop()
            self.mins.pop()
    
        def top(self) -> int:
            return self.stack[-1]
    
        def min(self) -> int:
            return self.mins[-1]
    
    
    # Your MinStack object will be instantiated and called as such:
    # obj = MinStack()
    # obj.push(x)
    # obj.pop()
    # param_3 = obj.top()
    # param_4 = obj.min()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    此题由于要求时间复杂度为O(1),最直接的想法就是用空间换时间,通过额外使用一个栈来存储最小元素解决了问题。

    评论区JAVA解法,包含最小值成员变量的链表

        private Node head;
    
        public MinStack() {
    
        }
    
        public void push(int x) {
    
            if (head == null)
                head = new Node(x, x, null);
            else
                head = new Node(x, Math.min(head.min, x), head);
        }
    
        public void pop() {
    
            head = head.next;
        }
    
        public int top() {
    
            return head.val;
        }
    
        public int min() {
    
            return head.min;
        }
    
        private class Node {
    
            int val;
            int min;
            Node next;
    
            public Node(int val, int min, Node next) {
    
                this.val = val;
                this.min = min;
                this.next = next;
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    翻了官方题解里只要穫一样的辅助栈,但是在评论区找到了另一种不需要额外开空间的单栈做法,即栈内不是只存储当前元素,同时还存储最小元素。不过事实上这种方法所需要的空间本质是一样多的,并且代码的可读性并不如辅助栈。

  • 相关阅读:
    BUUCTF Web 极客大挑战 2019 EasySQL
    Windows 11 新材质 Mica Alt 效果展示
    MIPS指令集摘要
    论文阅读-多目标强化学习-envelope MOQ-learning
    【每日一题】最大矩形
    Python Cartopy地图投影【3】
    手机注册.
    Zookeeper
    Java版本spring cloud + spring boot企业电子招投标系统源代码
    Unity数据持久化——XML
  • 原文地址:https://blog.csdn.net/qq_44459787/article/details/126949893