
解题思路:
- 遍历字符串: 逐个处理字符。
- 处理左括号: 遇到左括号时,将其压入栈中。
- 处理右括号: 遇到右括号时,检查栈顶是否有对应的左括号:
- 若栈为空或栈顶元素不匹配,返回false。
- 否则,弹出栈顶元素。
- **最终校验:**遍历结束后,若栈为空,则所有括号均正确闭合,返回 true;否则返回 false。
Java代码:
class Solution {public boolean isValid(String s) {Deque<Character> stack = new LinkedList<>();Map<Character, Character> map = new HashMap<>() {{put(')','(');put(']','[');put('}','{');}};for (char c : s.toCharArray()) {if (map.containsKey(c)) {if (stack.isEmpty() || stack.pop() != map.get(c))return false;} else {stack.push(c);}}return stack.isEmpty();}
}
复杂度分析:
- 时间复杂度: O(n),其中 n 是字符串的长度。每个字符被处理一次,所有操作均为常数时间。
- 空间复杂度: O(n),最坏情况下(如全是左括号),栈的空间复杂度为 O(n)。

解题思路:
- 数据结构: 使用 Deque<int[]>(双端队列)模拟栈,每个元素是一个长度为2的数组 int[]。
- 数组的第一个元素:存储实际的值 val。
- 数组的第二个元素:存储当前栈的最小值。
- 关键逻辑: 每次 push 新值时,动态记录当前最小值,确保每个节点独立保存其插入时的最小值状态。
Java代码:
class MinStack {private Deque<int[]> stack;public MinStack() {stack = new LinkedList<>();}public void push(int val) {stack.push(new int[]{val, Math.min(val, getMin())});}public void pop() {stack.pop();}public int top() {return stack.peek()[0];}public int getMin() {return stack.isEmpty() ? Integer.MAX_VALUE : stack.peek()[1];}
}
复杂度分析:
- 时间复杂度: O(1)。
- 空间复杂度: O(n)。