算法-有效的括号和最小栈

338 阅读1分钟

这是我参与更文挑战的第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();
    }

复杂度分析

  • 时间复杂度:O(N)O(N)ns的长度。

  • 空间复杂度:O(n)O(n)ns的长度,栈使用空间长度。

最小栈

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 push(x) —— 将元素 x 推入栈中。 pop() —— 删除栈顶的元素。 top() —— 获取栈顶元素。 getMin() —— 检索栈中的最小元素。

使用双队列

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操作,originStacksmallStack保持一致即可。

复杂度分析:

  • 时间复杂度:O(1)O(1),增加,删除和查都是都是O(1)O(1)

  • 空间复杂度:O(n)O(n)n为栈的元素,两个栈的空间为O(n)O(n)