
解题思路:
- 遍历字符串: 逐个处理字符。
- 处理左括号: 遇到左括号时,将其压入栈中。
- 处理右括号: 遇到右括号时,检查栈顶是否有对应的左括号:
- 若栈为空或栈顶元素不匹配,返回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)。