hot100-一刷-12栈(共5道题)

20. 有效的括号

题目链接

题目描述

image

代码实现

分析:

代码:

class Solution {
    public boolean isValid(String s) {
        int n = s.length();
        if(n % 2 == 1) return false;
        Deque<Character> st = new LinkedList<>();
        for (char c : s.toCharArray()){
            if(c == '(') {
                st.push(')');
            }else if(c == '['){
                st.push(']');
            }else if(c == '{'){
                st.push('}');
            }else if (st.isEmpty() || st.pop() != c){
                return false;
            }
        }
        return st.isEmpty();
    }
}

155. 最小栈

题目链接

题目描述

image
poptopgetMin 操作总是在 非空栈 上调用

代码实现

分析:

代码:

class MinStack {
    private Deque<int[]> st = new ArrayDeque<>();

    public MinStack() {
        st.push(new int[]{0, Integer.MAX_VALUE});
    }
    
    public void push(int val) {
        st.push(new int[]{val, Math.min(getMin(), val)});
    }
    
    public void pop() {
        st.pop();
    }
    
    public int top() {
        return st.peek()[0];
    }
    
    public int getMin() {
        return st.peek()[1];
    }
}

394. 字符串解码

题目链接

题目描述

image

代码实现

分析:

代码:

class Solution {
    public String decodeString(String s) {
        StringBuilder res = new StringBuilder();
        int multi = 0;
        LinkedList<Integer> stack_multi= new LinkedList<>();
        LinkedList<String> stack_res= new LinkedList<>();

        for (char c : s.toCharArray()){
            if (c == '['){
                stack_multi.addLast(multi);
                stack_res.addLast(res.toString());
                multi = 0;
                res = new StringBuilder();
            } else if (c == ']') {
                StringBuilder tmp = new StringBuilder();
                int cur_multi = stack_multi.removeLast();
                for (int i = 0; i < cur_multi; i++){
                    tmp.append(res);
                }
                res = new StringBuilder(stack_res.removeLast() + tmp);
            }else if (c >= '0' && c <='9') multi = multi * 10 + c-'0';
            else res.append(c);
        }
        return res.toString();
    }
}

739. 每日温度

题目链接

题目描述

image

代码实现

分析:
单调栈,(相对栈顶的)下一个更大(小)的元素入栈,就弹出栈顶。继续比较。 因此,如果入栈的是元素所在数组的索引,就可以比较入栈元素和栈中元素的位置关系。如果正常的按元素自身入栈,栈经过这样之后就是呈单调的特征。

代码:

// 从左到右
class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int n = temperatures.length;
        int[] ans = new int[n];
        Deque<Integer> st = new ArrayDeque<>();
        for(int i = 0; i < n; i++){
            int t = temperatures[i];
            while (!st.isEmpty() && t > temperatures[st.peek()]){
                // 弹出的是这一段中比temperatures[i]小的那个的索引
                int j = st.pop();
                // 弹出的是小的,并且知道它的索引是j, 同时现在在遍历的就是第一个比它大的,即 i
                ans[j] = i - j; 
            }
            st.push(i);
        }
        return ans;
    }
}


// 从右到左 单调栈
class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int n = temperatures.length;
        int[] ans = new int[n];
        Deque<Integer> st = new ArrayDeque<>();
        for(int i = n-1; i >=0; i--){
            int t = temperatures[i];
            while (!st.isEmpty() && t >= temperatures[st.peek()]){
                st.pop();
            }
            if(!st.isEmpty()){
                ans[i] = st.peek() - i;
            }
            st.push(i);
        }
        return ans;
    }
}

84. 柱状图中最大的矩形

题目链接

题目描述

image

代码实现

分析:

代码:

class Solution {
    public int largestRectangleArea(int[] heights) {
        int n = heights.length;
        
        // 每个元素的左边 第一个比该元素小 的下标
        int[] left = new int[n];
        Deque<Integer> st = new ArrayDeque<>();
        for(int i = 0; i < n; i++){
            int x = heights[i];
            // <= 是因为相等的时候要替换成最右边的, 最右边的是最靠近 x 的
            while(!st.isEmpty() && x <= heights[st.peek()]){
                st.pop();
            }
            left[i] = st.isEmpty() ? -1 : st.peek();
            st.push(i);
        }

        // 每个元素的右边 第一个比该元素小 的下标
        int[] right = new int[n];
        st.clear();
        for (int i = n-1; i >=0; i--){
            int x = heights[i];
            while(!st.isEmpty() && x <= heights[st.peek()]){
                st.pop();
            }
            right[i] = st.isEmpty() ? n : st.peek();
            st.push(i);
        }

        int ans = 0;
        for(int i = 0; i < n; i++){
            int w = right[i] - left[i] -1;
            int area =  w * heights[i];
            ans = ans > area ? ans : area;
        }
        return ans;
    }
}
posted @ 2024-12-25 23:53  chendsome  阅读(6)  评论(0编辑  收藏  举报