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

柱状图中最大的矩形

一、题目简介

给定 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. 更多解法:链接
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值