当前位置: 首页 > article >正文

力扣-Hot100-栈【算法学习day.40】

前言

###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!!


习题

1.最小栈

题目链接:155. 最小栈 - 力扣(LeetCode)

题面:

分析:其他好说,需要思考的是如何快速获得最小值,我们可以定义一个数组用来存储从栈底到栈顶所有元素的最小值,在每次添加新元素时维护这个数组,代码具体如下:

代码:

class MinStack {
    int[] stack;
    int r;
    int[] min;    
    public MinStack() {
    stack = new int[30005];
    min = new int[30005];
    r = 0;
    }
    
    public void push(int val) {
        if(r==0){
            min[0] = val;
        }else{
            min[r] = Math.min(val,min[r-1]);
        }
        stack[r++] = val;
    }
    
    public void pop() {
        r--;
    }
    
    public int top() {
        return stack[r-1];
    }
    
    public int getMin() {
        return min[r-1];
    }
}

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(val);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.getMin();
 */

2.字符串解码

题目链接:394. 字符串解码 - 力扣(LeetCode)

题面:

基本分析:这题我是通过递归来模拟解码过程,例如示例一,遇到数字,则递归到下一层,拿到返回的字符串,拼接次数为数字

class Solution {
    int l = 0;
    int n;
    char[] chars;
    public String decodeString(String s) {
        chars = s.toCharArray();
        n = chars.length;
        String ans = "";
        while(l<n){
            ans+=recursion();
        }
        return ans;
    }

    public String recursion(){
        String ans = "";
        while(l<n){
            if(chars[l]>'0'&&chars[l]<='9'){
                int flag = 0;
                while(chars[l]>='0'&&chars[l]<='9'){
                    flag = flag*10+(chars[l]-'0');
                    l++;
                }
                l++;
                String s = recursion();
                for(int i = 0;i<flag;i++){
                    ans+=s;
                }
            }
            else if(chars[l]>='a'&&chars[l]<='z'){
                ans+=chars[l];
                l++;
            }
            else if(chars[l]==']'){
                l++;
                return ans;
            }else{
                l++;
            }
        }
        return ans;
    }
}

3.每日温度

题目链接:739. 每日温度 - 力扣(LeetCode)

题面:

基本分析:利用单调栈,从右向前遍历,如果栈中存在元素,就从栈中找到比当前元素更大的元素(如果没有,直到栈为空),每次循环结束将当前元素下标存入栈中

代码:

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int n = temperatures.length;
        int[] ans = new int[n];
        int[] stack = new int[n];
        int r = 0;
         for(int i = n-1;i>=0;i--){
            while(r>0&&temperatures[stack[r-1]]<=temperatures[i]){
                r--;
            }
            if(r>0){
                ans[i] = stack[r-1] - i;
            }
            stack[r++] = i;
         }
        
        return ans;

    }
}

4.柱状图中最大的矩形

题目链接:84. 柱状图中最大的矩形 - 力扣(LeetCode)

题面:

附上灵神双单调栈代码:

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];
            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++) {
            ans = Math.max(ans, heights[i] * (right[i] - left[i] - 1));
        }
        return ans;
    }
}

后言

上面是力扣Hot100的栈专题,下一篇是其他专题的习题,希望有所帮助,一同进步,共勉!


http://www.kler.cn/a/409605.html

相关文章:

  • Oracle 11gR2 坏块修复实例一则
  • SCAU软件体系结构实验四 组合模式
  • C语言指针作业
  • 如何定位 Mysql 负载高
  • 解决Dcat Admin laravel框架登录报错问题,(blocked:mixed-content)
  • 快速识别模型:simple_ocr,部署教程
  • 梧桐数据库的高效索引技术行业调研报告
  • 理解clickhouse 里的分区和分片键区别
  • 降本增效的新利器
  • 第49届ICPC亚洲区域赛,非凸科技再次支持上海赛站
  • TensorFlow手动更新模型特定变量
  • 重写radioselect类自定义个性化单选框
  • Flink四大基石之Window
  • 黄仁勋:人形机器人在内,仅有三种机器人有望实现大规模生产
  • Web 学习笔记 - 网络安全
  • 简单快速区分Shell, sh, bash:
  • C/C++中的回调用法
  • 【测试工具JMeter篇】JMeter性能测试入门级教程(二)出炉,测试君请各位收藏了!!!
  • 《用 Python 和 Tkinter 打造惊喜弹窗小应用教程》
  • 【MySQL】数据库 Navicat 可视化工具与 MySQL 命令行基本操作
  • 【青牛科技】D3308 一块带有 ALC 的双通道前置放大器。它适用于立体声收录机和盒式录音机。
  • 小米C++ 面试题及参考答案下(120道面试题覆盖各种类型八股文)
  • 对象的大小
  • Paddle Inference部署推理(十二)
  • Flink Standalone 集群模式安装部署教程
  • 「Mac玩转仓颉内测版32」基础篇12 - Cangjie中的变量操作与类型管理