当前位置 博文首页 > Inmaturity_7的博客:算法练习帖--42--柱状图中最大的矩形(Java)

    Inmaturity_7的博客:算法练习帖--42--柱状图中最大的矩形(Java)

    作者:[db:作者] 时间:2021-08-01 11:40

    柱状图中最大的矩形

    一、题目简介

    给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
    (题目来源:力扣官网)

    求在该柱状图中,能够勾勒出来的矩形的最大面积。
    在这里插入图片描述
    以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。
    在这里插入图片描述

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

    二、解决方法

    1. 贪心算法
      可以想象成按每个单独的矩形横切所有矩形,求最大面积的那个
    package com.lxf.test;
    
    public class LargestRectangleArea {
        public static void main(String[] args) {
            System.out.println(largestRectangleArea(new int[]{2,1,2}));
        }
     
        public static int largestRectangleArea(int[] heights) {
            int maxArea=0;
             //遍历数组的每一个值
            for (int i = 0; i < heights.length; i++) {
                int curArea=heights[i];
                int j=i;
                int k=i;
                //当前数字向右搜索比它大的最后一个数字的下标
                while(j<heights.length&&curArea<=heights[j]){
                    j++;
                }
                //当前数字向左搜索比它大的最后一个数字的下标
                while(k>=0&&curArea<=heights[k]){
                    k--;
                }
                //两下标相减再减1乘以当前数字就是矩形的面积了,记录每个面积的最大值
                maxArea=Math.max(maxArea, (j-k-1)*heights[i]);
            }
            return maxArea;
        }
    }
    
    1. 思考:题目要求是矩形,所以需要排除正方形的情况(力扣过不了,应该是把正方形也看做矩形了,比如[1])
    public class LargestRectangleArea {
        public static void main(String[] args) {
            System.out.println(largestRectangleArea(new int[]{2,1,2}));
        }
     
        public static int largestRectangleArea(int[] heights) {
            int maxArea=0;
             //遍历数组的每一个值
            for (int i = 0; i < heights.length; i++) {
                int curArea=heights[i];
                int j=i;
                int k=i;
                //当前数字向右搜索比它大的最后一个数字的下标
                while(j<heights.length&&curArea<=heights[j]){
                    j++;
                }
                //当前数字向左搜索比它大的最后一个数字的下标
                while(k>=0&&curArea<=heights[k]){
                    k--;
                }
                //两下标相减再减1乘以当前数字就是矩形的面积了,记录每个面积的最大值
               if(heights[i]!=(j-k-1)){//排除正方形
                    maxArea=Math.max(maxArea, (j-k-1)*heights[i]);
                }
            }
            return maxArea;
        }
    }
    
    1. 更多解法:链接
    cs