Leetcode85. 最大矩形

题目传送地址:https://leetcode.cn/problems/maximal-rectangle/

运行效率:
在这里插入图片描述
代码如下: //哨兵机制+单调栈 解法

class Solution {
    public static int maximalRectangle(char[][] matrix) {
        int maxArea = 0;
        int[] heights = new int[matrix[0].length];
        for (int row = 0; row < matrix.length; row++) {
            for (int col = 0; col < matrix[0].length; col++) {
                if (matrix[row][col] == '1') {
                    heights[col]++;
                } else {
                    heights[col] = 0;
                }
            }
            int area = largestRectangleArea(heights);
            maxArea = Math.max(area, maxArea);
        }
        return maxArea;
    }

    //哨兵机制+单调栈  解法
    public static int largestRectangleArea(int[] heights) {
        int maxArea = 0;
        Stack<Integer> stack = new Stack<>();
        //先在数组的首尾各加一个哨兵
        int[] array = new int[heights.length + 2];
        System.arraycopy(heights, 0, array, 1, heights.length);
        //这样一来数组的收尾就各有一个元素的值是0
        for (int i = 0; i < array.length; i++) {
            if (stack.isEmpty()) { //如果栈为空
                stack.push(i);
            } else {  //如果栈不空
                Integer peek = stack.peek();//查看栈顶元素
                //如果栈顶元素的高度大一些
                if (array[peek] > array[i]) {
                    stack.pop();//栈顶元素出栈
                    int width = 0;
                    if (stack.isEmpty()) {  //如果接下来栈里面没有元素了
                        width = heights.length;
                    } else {
                        int left = stack.peek();
                        width = i - left-1;
                    }
                    int area = width * array[peek];
                    maxArea = Math.max(maxArea, area);
                    i = i - 1;
                } else {  //如果栈顶元素小一些,那就继续入栈
                    stack.push(i);
                }
            }
        }
        return maxArea;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Java全栈研发大联盟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值