首页 > 其他分享 >Leetcode84 柱状图中最大的矩形

Leetcode84 柱状图中最大的矩形

时间:2024-06-23 17:58:26浏览次数:3  
标签:wid int res Leetcode84 length heights height 柱状图 矩形

题目描述

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积
实例

解题思路

思路一:暴力寻找,从每个位置出发,向左右两边扩散查找,若发现柱形比当前位置高,则宽度加一,组成长方形,代码实现如下,但是提交之后发现在极端情况下会超时

public int largestRectangleArea(int[] heights) {
        int res = 0;
        for (int i = 0; i < heights.length; i++) {
            int height = heights[i], wid = 1;
            for (int j = i + 1; j < heights.length; j++) {
                if (heights[j] < height) break;
                else {
                    wid++;
                }
            }
            for (int j = i - 1; j >= 0; j--) {
                if (heights[j] < height) break;
                else {
                    wid++;
                }
            }
            res = Math.max(res, height * wid);
        }
        return res;
    }

算法优化

在暴力查询的基础上,研究发现,在某些情况下,可以前置信息来加速后续的查询,也就是说,可以使用动态规划来解题。使用zuo[i]数组表示从0到i,柱状图中以heights[i]为高的最大矩形宽度,从左向右遍历一次,使用you[i]数组表示从i到 len -1(终点位置),柱状图中以heights[i]为高的最大矩形宽度,再遍历一次。
注意!!,第二次遍历时,也就是从i到 len -1(终点位置),向右寻找柱状图中以heights[i]为高的最大矩形时,我们更新最大面积时记得加上前一次求出的左边宽度zuo[i]数

代码实现

class Solution {
    public int largestRectangleArea(int[] heights) {
       int res = heights[0];
        int[] zuo = new int[heights.length], you = new int[heights.length];
        zuo[0] = 1;
        you[heights.length - 1] = 1;
        for (int i = 1; i < heights.length; i++) {
            int height = heights[i], wid = 1;
            int j = i - 1;
            while (j >= 0) {
                if (heights[j] < height) {
                    break;
                } else {
                    wid += zuo[j];
                    j = j - zuo[j];
                }
            }
            zuo[i] = wid;
            res = Math.max(res, height * wid);
        }
        for (int i = heights.length - 2; i >= 0; i--) {
            int height = heights[i], wid = 1;
            int j = i + 1;
            while (j < heights.length) {
                if (heights[j] < height) break;
                else {
                    wid += you[j];
                    j = j + you[j];
                }
            }
            you[i] = wid;
            if (i > 0) wid = (wid + zuo[i] -1);
            res = Math.max(res, height * wid);
        }

        return res;
    }
}

算法效果

在这里插入图片描述

标签:wid,int,res,Leetcode84,length,heights,height,柱状图,矩形
From: https://blog.csdn.net/zjshuster/article/details/139902335

相关文章

  • qt 简单实验 一个可以向右侧拖拽缩放的矩形
    1.概要目的是设置一个可以拖拽缩放的矩形,这里仅用右侧的一个边模拟这个过程。就是为了抓住核心,这个便解决了,其他的边也是一样的。而这个更能体现原理。2.代码2.1 resizablerectangle.h#ifndefRESIZABLERECTANGLE_H#defineRESIZABLERECTANGLE_H#include<QWidget>#in......
  • 柱状图
    function(data,params){constmyChart=this.myChart;consttwoYearData=[17,45,4,34,23,54]constthreeYearData=[11,35,9,24,12,50]consttwoYearBarColor={type:'linear',x:0,y:0,x2:0,y2:1,......
  • 85. 最大矩形
      classSolution{public:intmaximalRectangle(vector<vector<char>>&matrix){intm=matrix.size();intn=matrix[0].size();vector<vector<int>>left(m,vector<int>(n,0));for(inti=0......
  • Ecahrts竖向柱状图实现自动滚动
     效果如下:1.首先声明一个timer定时器标识lettimer:NodeJS.Timer;//定时器2.再声明窗口展示的数量,yAxisIndex2用来记录当前index已经加了多少,方便再formatter中格式化标题的相关信息constdataZoomEndValue=6;//数据窗口范围的结束数值(一次性展示几个)letyAxis......
  • 【FFmpeg】SDL 音视频开发 ② ( SDL 视频显示函数 | 设置渲染器目标纹理 | 设置渲染器
    文章目录一、SDL视频显示函数1、SDL的渲染器和纹理之间的关系2、SDL_SetRenderTarget函数-设置渲染器目标纹理3、SDL_SetRenderDrawColor函数-设置渲染器颜色4、SDL_RenderClear函数-清除渲染器5、SDL_RenderDrawRect函数-渲染器绘制矩形6、SDL_Render......
  • daimayuan 矩形面积并
    #define_CRT_SECURE_NO_WARNINGS#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<vector>#include<array>usingnamespacestd;/*http://oj.daimayuan.top/course/15/problem/688平......
  • [lnsyoj283/luoguP1856/IOI1998]矩形周长Picture
    题意原题链接求几个矩形的周长并sol遇到几何图形的**并,都可以使用扫描线思想来解决观察易得,与x轴平行的边和与y轴平行的边相互独立,因此可以扫描两次,分别计算并累加以与x轴平行的边为例:假设有一条平行于x轴的直线从下到上扫描,每当遇到一条边时,若这条边是某个矩形的下边,则在......
  • R:microtable包计算相对丰度堆叠柱状图
    rm(list=ls())setwd("C:\\Users\\Administrator\\Desktop\\New_microtable")#设置工作目录library(microeco)library(magrittr)library(dplyr)library(tibble)feature_table<-read.table('Bac_genus.txt',header=TRUE,row.names=1......
  • Q9 LeetCode844 比较含退格的字符串
    1.使用StringBuffer替代String挨个字符进行操作StringBuffersb=newStringBuffer(str);2.sb.charAt(i)进行字符串循环3.sb.append(char)进行字符数组的组成4.sb.deleteAt(i)进行指定位置字符的删除5.若比较StringBuffer字符是否相等需要将其转换成String使用toString()方法......
  • 代码随想录算法训练营Day60 | 84.柱状图中最大的矩形 | Python | 个人记录向
    注:今天是代码随想录训练营的最后一天啦!!!本文目录84.柱状图中最大的矩形做题看文章以往忽略的知识点小结个人体会84.柱状图中最大的矩形代码随想录:84.柱状图中最大的矩形Leetcode:84.柱状图中最大的矩形做题无思路。看文章与42.接雨水很像,42.接雨水是找每个......