Leetcode P84 Java使用栈解决此问题

Leetcode P84 Java使用栈解决此问题

执行用时:22 ms, 在所有 Java 提交中击败了69.98%的用户

内存消耗:54.5 MB, 在所有 Java 提交中击败了54.50%的用户

通过测试用例:98 / 98

ideas

​ 首先创建一个操作数组用来帮助我们进行操作,还要创建一个栈,栈用存放每个元素所在的下标,为了方便计算宽度。

        int res =0 ;
        int n = heights.length;
        int[] arr = new int[n+2];
        System.arraycopy(heights,0,arr,1,n);
        /**
         * 栈中存放下标,方便计算宽度
         */
        Deque<Integer> stack = new ArrayDeque<>();
        int nOfArr = arr.length;

我们的操作数组长度多了2是因为我们要将0和nOfArr-1下标的元素设置为0为了方便帮助我们操作,也用来防止一些情况

这边两个位置设置0 主要防止

类似 4 5 这时候我们arr的值是0 4 5 0 这时候stack把5弹出(因为0小于5)

那么就是 5 *(3-1-1) = 5

接下来 4 * (3 - 0 - 1) = 8

比如 4 5 3 这时候arr就是 0 4 5 3 0 我们发现3比5小,那么5弹出

5 * (3 - 1 - 1) = 5

​ 4 * (3 - 0 - 1) = 8

接下来我们stack中的元素为 arr[0]: 0 ,arr[3]: 3

接下来发现0比3小,那么3弹出

​ 3 * (4 - 0 - 1) = 9

      arr[0] = arr[nOfArr-1] = 0;

接下来就进行判断,如果当前下标的高度小于栈顶的元素高度,那么就开始计算面积

        for (int i = 0; i < nOfArr; i++) {
            int h = arr[i];
            while (!stack.isEmpty() && h < arr[stack.peek()]){
                int tmph = arr[stack.pop()];
                res = Math.max(res,tmph * (i - stack.peek() - 1));
            }
            stack.push(i);
        }

最终的res就是我们的答案

        return res;

Code

	 public int largestRectangleArea(int[] heights) {
        int res =0 ;
        int n = heights.length;
        int[] arr = new int[n+2];
        System.arraycopy(heights,0,arr,1,n);
        /**
         * 栈中存放下标,方便计算宽度
         */
        Deque<Integer> stack = new ArrayDeque<>();
        int nOfArr = arr.length;

        //这边两个位置设置0 主要防止
        // 类似  4 5 这时候我们arr的值是0 4 5 0 这时候stack把5弹出(因为0小于5)
        //      那么就是 5 *(3-1-1) = 5
        //      接下来   4 * (3 - 0 - 1) = 8
        // 比如  4 5 3 这时候arr就是 0 4 5 3 0 我们发现3比5小,那么5弹出
        //              5 * (3 - 1 - 1) = 5
        //              4 * (3 - 0 - 1) = 8
        // 接下来我们stack中的元素为 arr[0]: 0 ,arr[3]: 3
        // 接下来发现0比3小,那么3弹出
        //              3 * (4 - 0 - 1) = 9
        arr[0] = arr[nOfArr-1] = 0;

        for (int i = 0; i < nOfArr; i++) {
            int h = arr[i];
            while (!stack.isEmpty() && h < arr[stack.peek()]){
                int tmph = arr[stack.pop()];
                res = Math.max(res,tmph * (i - stack.peek() - 1));
            }
            stack.push(i);
        }

        return res;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哇塞大嘴好帅(DaZuiZui)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值