这是我参与更文挑战的第8天,活动详情查看: 更文挑战
有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。
使用stack
public boolean isValid(String s) {
//如果是基数那么肯定是无效的
if (s.length() % 2 != 0) {
return false;
}
Stack<Character> characters = new Stack<>();
for (char c : s.toCharArray()) {
if (c == '(') {
characters.push(')');
} else if (c == '[') {
characters.push(']');
} else if (c == '{') {
characters.push('}');
} else {
// 如果stack里面为空,那么第一个输入的是右边
if (characters.isEmpty()) {
return false;
}
Character top = characters.pop();
if (top != c) {
return false;
}
}
}
// stack为空,证明左边和右边都匹配上了
return characters.isEmpty();
}
复杂度分析
-
时间复杂度:,
n为s的长度。 -
空间复杂度:,
n为s的长度,栈使用空间长度。
最小栈
使用双队列
class MinStack {
//originStack存储原有数据
private final Deque<Integer> originStack;
//smallStack存放originStack中最小的元素
private final Deque<Integer> smallStack;
public MinStack() {
originStack = new LinkedList<>();
smallStack = new LinkedList<>();
smallStack.push(Integer.MAX_VALUE);
}
public void push(int val) {
originStack.push(val);
//这里需要使用peek,保持smallStack与originStack长度一致
smallStack.push(Math.min(smallStack.peek(), val));
}
public void pop() {
originStack.pop();
smallStack.pop();
}
public int top() {
return originStack.peek();
}
public int getMin() {
return smallStack.peek();
}
}
首先定义originStack用来保存元素操作的栈顺序,smallStack用来保存元素中最少的值,如果每次入栈值不小于当前smallStack,那么就重复入栈当前最小值。后面的pop操作,originStack和smallStack保持一致即可。
复杂度分析:
-
时间复杂度:,增加,删除和查都是都是。
-
空间复杂度:,
n为栈的元素,两个栈的空间为。