【每日算法】队 栈| day3

224.基本计算器

代码逻辑:

存储:左表达式  符号(用数字存)  右表达式   结果   数字栈

1.先申请以上变量

2.对这个字符串进行遍历

两种情况:数字和符号

数字:先将字符值转化为数值,然后再来一个遍历,遇到符号停止,来获取完整数值

                最后,进行运算

符号:

        运算符号: +  -  对应操作变量即可

        括号:( ---- 将现存的res,符号位,压入栈中

                   ) ---- 现存的结果为右表达式 将栈弹出   弹出的第一位是符号位,第二位为左表达式

class Solution {
    public int calculate(String s) {
        int left = 0,right = 0,res =0;
        int sign = 1;
        Stack<Integer> stack = new Stack<Integer>();

        for(int i = 0 ; i < s.length() ; i++){
            char ch = s.charAt(i);
            if(Character.isDigit(ch)){
                int val = ch - '0';
                while(i + 1 < s.length()  && Character.isDigit(s.charAt(i + 1))){
                    i++;
                    val = val * 10 + s.charAt(i) - '0';
                }
                res = res + sign * val;
            } else if(ch == '+'){
                sign = 1;
            } else if(ch == '-'){
                sign = -1;
            } else if(ch == '('){
                stack.push(res);
                res = 0;
                stack.push(sign);
                sign = 1;
            } else if(ch == ')'){
                sign = stack.pop();
                right = res;
                left = stack.pop();
                res = left + sign * right;
            }
        }
        return res;
    }
}

84.柱状图中最大的矩形

我们依旧用 四步分析法 来分析一下这道题目。

  • 模拟:模拟题目的运行。

  • 规律:尝试总结出题目的一般规律和特点。

  • 匹配:找到符合这些特点的数据结构与算法。

  • 边界:考虑特殊情况。

代码逻辑:

变量:结果值(面积值),存储栈(每一位的高度),构造新数组(两边各加个零)--- 迁移数组

遍历:遍历新数组的每一个值

        判断:

                条件:1.栈不空  2.新数组的这一位 比 新数组的栈顶那一位 小  ---- 高度比较

                        弹出栈顶元素

                        获取栈顶元素的高

                        栈顶元素弹出后,新的栈顶元素为其左侧边界

                        右侧边界为当前索引值

                        计算宽度 , 和 面积(与以前的面积取最大值)

            遍历中:将当前索引入栈

返回结果值

class Solution {
    public int largestRectangleArea(int[] heights) {
        int res = 0;
        Stack<Integer> stack = new Stack<Integer>();

        int[] newHeight = new int[heights.length + 2];
        newHeight[0] = 0;
        newHeight[newHeight.length - 1] = 0;

        for(int i = 1; i < heights.length + 1 ; i++){
            newHeight[i] = heights[i - 1];
        }

        

        for(int i = 0 ; i < newHeight.length; i++){
            while(!stack.isEmpty() && newHeight[i] < newHeight[stack.peek()]){
                int cur = stack.pop();
                int curHeight = newHeight[cur];

                int leftIndex = stack.peek();
                int rightIndex = i;
                int curWidth = rightIndex - leftIndex - 1;

                res = Math.max(res, curHeight * curWidth);
            }
            stack.push(i); 
        }

        return res;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值