LeetCode——84.柱状图中最大的矩形

LeetCode——84.柱状图中最大的矩形

题目

84.柱状图中最大的矩形
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。

LeetCode——84.柱状图中最大的矩形_第1张图片
以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。
LeetCode——84.柱状图中最大的矩形_第2张图片
图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。

示例:
输入: [2,1,5,6,2,3]
输出: 10

解析

暴力解法

依次遍历元素,然后设置两个指针,初始化为当前元素位置,一个往左,一个往右,只要高度比当前元素高,就移动指针,最后计算两个指针间的距离,然后乘上当前高度就是当前元素对应的面积,最后返回最大的面积就行了。

其他方法后续更新

代码

暴力解法

//暴力解法1
class Solution0084_01 {
    public int largestRectangleArea(int[] heights) {
        int len = heights.length; //数组长度

        if (len==0){
            return 0;
        }

        int res=0; //结果

        //从左到右遍历柱状图
        for (int i = 0; i < len; i++) {
            //定义往左、往右两个指针,初始化为当前位置
            int left=i;
            int right=i;

            //只要左边的比当前的高,就可以连续并围城矩形
            while ( left>0 && heights[left-1] >= heights[i]){
                left--; //左指针左移,将其包裹在内
            }

            //右边同理
            while (right<len-1 && heights[right+1] >= heights[i]){
                right++; //右指针右移,将其包裹在内
            }

            int width = right - left + 1;
            res = Math.max(res, width * heights[i]);

        }

        return res;
    }
}

LeetCode——84.柱状图中最大的矩形_第3张图片

存一下当前高度,更快一点 int curHeight = heights[i];

//暴力解法2
class Solution0084_02 {
    public int largestRectangleArea(int[] heights) {
        int len = heights.length; //数组长度

        if (len==0){
            return 0;
        }

        int res=0; //结果

        //从左到右遍历柱状图
        for (int i = 0; i < len; i++) {
            //定义往左、往右两个指针,初始化为当前位置
            int left=i;
            int right=i;

            //当前柱的高度
            int curHeight = heights[i];

            //只要左边的比当前的高,就可以连续并围城矩形
            while ( left>0 && heights[left-1] >= curHeight){
                left--; //左指针左移,将其包裹在内
            }

            //右边同理
            while (right<len-1 && heights[right+1] >= curHeight){
                right++; //右指针右移,将其包裹在内
            }

            int width = right - left + 1;
            res = Math.max(res, width * curHeight);

        }

        return res;
    }
}

在这里插入图片描述

你可能感兴趣的:(LeetCode)