Loading

第04课丨栈、队列、优先队列、双端队列实战题目

20 有效的括号

20. 有效的括号

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

class Solution {
    public boolean isValid(String s) {
        int n = s.length();
        if (n % 2 == 1) {  //单数就直接为假
            return false;
        }

        Map<Character, Character> pairs = new HashMap<Character, Character>() {{
            put(')', '(');
            put(']', '[');
            put('}', '{');
        }};
        Deque<Character> stack = new LinkedList<Character>();
        
        for (int i = 0; i < n; i++) {
            char ch = s.charAt(i);  
            if (pairs.containsKey(ch)) {  // 遍历字符串,是否属于右括号
                if (stack.isEmpty() || stack.peek() != pairs.get(ch)) {  // 栈不为空,且栈中此时元素为对应左括号
                    return false;
                }
                stack.pop();  // 弹出左括号
            } else {
                stack.push(ch);  // 如果是左括号就入栈
            }
        }
        return stack.isEmpty();
    }
}

155 最小栈

155. 最小栈

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:

MinStack() 初始化堆栈对象。
void push(int val) 将元素val推入堆栈。
void pop() 删除堆栈顶部的元素。
int top() 获取堆栈顶部的元素。
int getMin() 获取堆栈中的最小元素。

class MinStack {
    Deque<Integer> xStack;
    Deque<Integer> minStack;

    public MinStack() {
        xStack = new LinkedList<Integer>();
        minStack = new LinkedList<Integer>();
        minStack.push(Integer.MAX_VALUE);
    }
    
    public void push(int x) {
        xStack.push(x);
        minStack.push(Math.min(minStack.peek(), x));
    }
    
    public void pop() {
        xStack.pop();
        minStack.pop();
    }
    
    public int top() {
        return xStack.peek();
    }
    
    public int getMin() {
        return minStack.peek();
    }
}

239 滑动窗口最大值

239. 滑动窗口最大值


641 设计循环双端队列

641. 设计循环双端队列


42 接雨水

42. 接雨水


posted @ 2022-04-26 19:34  maju  阅读(46)  评论(0)    收藏  举报