Leetcode 栈 1
LeetCode 20. 有效的括号 ↑
题目
简单。 给定只包含 '('、')'、'['、']'、'{'、'}' 的字符串 s,判断其是否有效。
有效需同时满足:
- 左括号必须用相同类型的右括号闭合;
- 左括号必须以正确顺序闭合;
- 每个右括号都有对应的同类型左括号。
提示
1 ≤ len(s) ≤ 10^4s仅由括号字符'()[]{}'组成
代码(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 - 1pop、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)。

浙公网安备 33010602011771号