Leetcode 栈 1

题号直达: 20 有效的括号 | 155 最小栈

LeetCode 20. 有效的括号 ↑

题目

简单。 给定只包含 '('、')'、'['、']'、'{'、'}' 的字符串 s,判断其是否有效。

有效需同时满足:

  1. 左括号必须用相同类型的右括号闭合;
  2. 左括号必须以正确顺序闭合;
  3. 每个右括号都有对应的同类型左括号。

提示

  • 1 ≤ len(s) ≤ 10^4
  • s 仅由括号字符 '()[]{}' 组成

代码(Python):栈

用 栈 模拟:遇左括号则入栈;遇右括号则若栈顶为匹配的左括号则出栈,否则无效。若栈空时遇到右括号,也无效。扫完后栈须为空。

class Solution(object):
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """
        stack = []
        for i in range(len(s)):
            if not stack:
                if s[i] == "(" or s[i] == "[" or s[i] == "{":
                    stack.append(s[i])
                else:
                    return False
            else:
                if s[i] == "(" or s[i] == "[" or s[i] == "{":
                    stack.append(s[i])
                else:
                    if stack[-1] == "(" and s[i] == ")":
                        stack.pop()
                    elif stack[-1] == "[" and s[i] == "]":
                        stack.pop()
                    elif stack[-1] == "{" and s[i] == "}":
                        stack.pop()
                    else:
                        return False
        if not stack:
            return True
        else:
            return False

思路解析

  • 栈顶配对:右括号只与当前栈顶左括号匹配,保证「从内向外」闭合。
  • 提前失败:空栈遇右括号、或栈顶与当前右括号类型不一致,均可立刻 return False。
  • 结束条件:遍历结束后栈为空说明左右括号数量与顺序均匹配。
  • 复杂度:每个字符最多入栈、出栈各一次,时间 O(n),栈规模 O(n)。

LeetCode 155. 最小栈 ↑

题目

设计支持 push、pop、top 操作,并能在常数时间内检索最小元素的栈 MinStack。

需要实现:

  • MinStack():初始化栈对象。
  • push(val):将元素压栈。
  • pop():删除栈顶元素。
  • top():获取栈顶元素。
  • getMin():获取当前栈最小元素。

提示

  • -2^31 ≤ val ≤ 2^31 - 1
  • pop、top、getMin 总是在非空栈上调用
  • push、pop、top、getMin 最多被调用 3 * 10^4 次

代码(Python):双栈同步维护最小值

主栈 stack 存所有元素;辅助栈 min_stack 的每一层记录“到当前层为止的最小值”。这样在任意时刻,min_stack[-1] 就是当前最小值,getMin() 可 O(1) 返回。

class MinStack(object):

    def __init__(self):
        self.stack = []
        self.min_stack = [2 ** 31]

    def push(self, val):
        """
        :type val: int
        :rtype: None
        """
        self.stack.append(val)
        if val < self.min_stack[-1]:
            self.min_stack.append(val)
        else:
            self.min_stack.append(self.min_stack[-1])

    def pop(self):
        """
        :rtype: None
        """
        self.stack.pop()
        self.min_stack.pop()

    def top(self):
        """
        :rtype: int
        """
        return self.stack[-1]

    def getMin(self):
        """
        :rtype: int
        """
        return self.min_stack[-1]

讲解动图
最小栈 双栈维护最小值示意

思路解析

  • 同步压栈:每次 push 都向 min_stack 压入“新最小值”或“沿用旧最小值”,保证两栈长度一致。
  • 同步弹栈:pop 时两栈同时 pop,使最小值状态与主栈保持同步。
  • O(1) 查询最小值:getMin 直接返回 min_stack[-1],无需扫描主栈。
  • 复杂度:push/pop/top/getMin 均为 O(1);额外空间 O(n)。
posted @ 2026-10-12 00:23  Phier  阅读(1)  评论(0)    收藏  举报