首页 > 基础资料 博客日记

hot100之栈

2025-06-20 14:00:02基础资料围观10

Java资料网推荐hot100之栈这篇文章给大家,欢迎收藏Java资料网享受知识的乐趣

有效的括号(020)

跳过

最小栈(155)

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

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

  • 分析

使用双端队列作栈

利用动态规划, 每个栈元素维护自身val和min_val

字符串解码(394)

class Solution {
    public String decodeString(String s) {
        int idx = 0;
        StringBuilder builder = new StringBuilder();
        while (idx < s.length()){
            // 是字母
            if (s.charAt(idx) >= 'a'){
                builder.append(s.charAt(idx));
                idx++;
                continue;
            }
            idx = appendDupString(idx, s, builder);
            //是数字
        }
        return builder.toString();
    }

    private int appendDupString(int idx, String s , StringBuilder builder){
        int prefix_count = 0;

        while(s.charAt(idx) != '['){
            prefix_count = prefix_count * 10 + s.charAt(idx) - '0';
            idx++;
        }

        int rig_idx = idx+1;
        int nest = 1; 
        while (nest != 0){
            if (s.charAt(rig_idx) == '[') nest++;
            else if (s.charAt(rig_idx) == ']') nest--;
            rig_idx++;
        }

        String subString = decodeString(s.substring(idx+1, rig_idx-1));
        for (int i = 0; i < prefix_count; i++){
            builder.append(subString);
        }
        return rig_idx;
    }
}
  • 分析

递归调用

每日温度(739)

栈解法

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int n = temperatures.length;
        int[] res = new int[n];

        Deque<Integer> stack = new ArrayDeque<>();
        for (int i = n-1; i >= 0; i--){
            int t = temperatures[i];
            while(!stack.isEmpty() && t >=temperatures[stack.peek()]){
                stack.pop();
            }
            if (!stack.isEmpty()){
                res[i] = stack.peek() - i;
            }
            stack.push(i);
        }

        return res;
    }
}

跳表解法

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int n = temperatures.length;
        int[] res = new int[n];

        for (int i = n-2; i >= 0; i--){
            for (int j = i+1; j < n; j += res[j]){
                if (temperatures[j] > temperatures[i]){
                    res[i] = j - i;
                    break;
                }
                else if (res[j] == 0){
                    res[i] = 0;
                    break;
                }
            }
        }
        return res;
    }
}

  • 分析

栈解法

栈用于维护<最近><关联>数据

维护栈的单调性就是在维护栈组中的数据的<关联>性, 栈自身的性质可以用于保持<最近>特性

跳表解法

可能也许这是贪心

柱状图中最大矩形(084)

class Solution {
    public int largestRectangleArea(int[] heights) {
        int n = heights.length;
        Deque<Integer> stack = new ArrayDeque<>();
        stack.push(-1);
        int res = 0;
        for (int rig = 0; rig <= n; i++){
            int h = rig < n ? heights[rig] : -1;
            while(stack.size() > 1 && h <= heights[stack.peek()]){
                int height = heights[stack.pop()];
                int lef = stack.peek();
                res = Math.max(res, height * (rig - lef - 1));
            }
            stack.push(rig);
        }
        return
    }
}
  • 分析

维护栈的单调性, 非单调时弹出数据作max比较


文章来源:https://www.cnblogs.com/many-bucket/p/18938219
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

上一篇:Countdownlatch和Cylibarrir
下一篇:没有了

相关文章

本站推荐

标签云