[Leedcode][JAVA][第84题][柱状图中最大的矩形][暴力][单调栈]

【问题描述】[困难]

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。输入: [2,1,5,6,2,3]
输出: 10来源:力扣(LeetCode)

在这里插入图片描述

【解答思路】

1. 暴力

可以枚举以每个柱形为高度的最大矩形的面积。

具体来说就是:依次遍历柱形的高度,对于每一个高度分别向两边扩散,求出以当前高度为矩形的最大宽度多少。
在这里插入图片描述
时间复杂度:O(N^2) 空间复杂度:O(1)

public class Solution {public int largestRectangleArea(int[] heights) {int len = heights.length;// 特判if (len == 0) {return 0;}int res = 0;for (int i = 0; i < len; i++) {// 找左边最后 1 个大于等于 heights[i] 的下标int left = i;int curHeight = heights[i];while (left > 0 && heights[left - 1] >= curHeight) {left--;}// 找右边最后 1 个大于等于 heights[i] 的索引int right = i;while (right < len - 1 && heights[right + 1] >= curHeight) {right++;}int width = right - left + 1;res = Math.max(res, width * curHeight);}return res;}
}
2. 单调栈

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
时间复杂度:O(N) 空间复杂度:O(N)

import java.util.ArrayDeque;
import java.util.Deque;public class Solution {public int largestRectangleArea(int[] heights) {int len = heights.length;if (len == 0) {return 0;}if (len == 1) {return heights[0];}int area = 0;Deque<Integer> stack = new ArrayDeque<>();for (int i = 0; i < len; i++) {while (!stack.isEmpty() && heights[stack.peekLast()] > heights[i]){int height = heights[stack.removeLast()];while (!stack.isEmpty() &&  heights[stack.peekLast()] == height){stack.removeLast();}int width;if (stack.isEmpty()){//iwidth = i;} else {width = i - stack.peekLast() - 1;}area = Math.max(area , width * height);}stack.addLast(i);}
//遍历完还没出栈的while (!stack.isEmpty()){int height = heights[stack.removeLast()];while (!stack.isEmpty() &&  heights[stack.peekLast()] == height){stack.removeLast();}int width;if (stack.isEmpty()){width = len;//肯定能到达} else {width = len - stack.peekLast() - 1;}area = Math.max(area , width * height);}return area;}
}
3. 哨兵思想+单调栈

在这里插入图片描述

在这里插入图片描述
时间复杂度:O(N) 空间复杂度:O(N)

import java.util.ArrayDeque;
import java.util.Deque;public class Solution {public int largestRectangleArea(int[] heights) {int len = heights.length;if (len == 0) {return 0;}if (len == 1) {return heights[0];}int area = 0;int[] newHeights = new int[len + 2];for (int i = 0; i < len; i++) {newHeights[i + 1] = heights[i];}len += 2;heights = newHeights;Deque<Integer> stack = new ArrayDeque<>();stack.addLast(0);for (int i = 1; i < len; i++) {while (heights[stack.peekLast()] > heights[i]) {int height = heights[stack.removeLast()];int width  = i - stack.peekLast() - 1;area = Math.max(area, width * height);}stack.addLast(i);}return area;}
}

【总结】

1.算法思想

其实可以把这个想象成锯木板,如果木板都是递增的那我很开心,如果突然遇到一块木板i矮了一截,那我就先找之前最戳出来的一块(其实就是第i-1块),计算一下这个木板单独的面积,然后把它锯成次高的,这是因为我之后的计算都再也用不着这块木板本身的高度了。再然后如果发觉次高的仍然比现在这个i木板高,那我继续单独计算这个次高木板的面积(应该是第i-1和i-2块),再把它俩锯短。直到发觉不需要锯就比第i块矮了,那我继续开开心心往右找更高的。当然为了避免到了最后一直都是递增的,所以可以在最后加一块高度为0的木板

这个算法的关键点是把那些戳出来的木板早点单独拎出来计算,然后就用不着这个值了。

2.对于 使用 Java 的朋友, Stack 改用 Deque 的问题,参考文章:https://mp.weixin.qq.com/s/Ba8jrULf8NJbENK6WGrVWg
3.单调栈

出栈都要做的判断!stack.isEmpty()
在这里插入图片描述

4.哨兵思想

在这里插入图片描述

转载链接:https://leetcode-cn.com/problems/largest-rectangle-in-histogram/solution/bao-li-jie-fa-zhan-by-liweiwei1419/

参考链接:
https://leetcode-cn.com/problems/largest-rectangle-in-histogram/solution/xiang-jie-dan-diao-zhan-bi-xu-miao-dong-by-sweetie/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html:(20):使用下拉框进行多选和使用提交按钮提交

使用下拉列表框进行多选 下拉列表也可以进行多选操作&#xff0c;在<select>标签中设置multiple"multiple"属性&#xff0c;就可以实现多选功能&#xff0c;在 windows 操作系统下&#xff0c;进行多选时按下Ctrl键同时进行单击&#xff08;在 Mac下使用 Comm…

html:(21):重置按钮和label标签

使用重置按钮&#xff0c;重置表单信息 当用户需要重置表单信息到初始时的状态时&#xff0c;比如用户输入“用户名”后&#xff0c;发现书写有误&#xff0c;可以使用重置按钮使输入框恢复到初始状态。只需要把type设置为"reset"就可以。 语法&#xff1a; <i…

[Leedcode][JAVA][第1431题][拥有糖果最多的孩子][暴力][六一儿童节]

【问题描述】[中等] 给你一个数组 candies 和一个整数 extraCandies &#xff0c;其中 candies[i] 代表第 i 个孩子拥有的糖果数目。对每一个孩子&#xff0c;检查是否存在一种方案&#xff0c;将额外的 extraCandies 个糖果分配给孩子们之后&#xff0c;此孩子有 最多 的糖果…

生产系统服务器是啥意思,生产系统服务器主机名怎么看

生产系统服务器主机名怎么看 内容精选换一换部署组复制的最常见方法是使用多个服务器实例&#xff0c;以提供高可用性。也可以在本地部署组复制&#xff0c;例如出于测试目的。注意:组复制通常部署在多个主机上&#xff0c;因为这样可以确保提供高可用性。本地部署不适用于生产…

html:(22):认识css样式和css的优势

认识CSS样式 CSS全称为“层叠样式表 (Cascading Style Sheets)”&#xff0c;它主要是用于定义HTML内容在浏览器内的显示样式&#xff0c;如文字大小、颜色、字体加粗等。 如下列代码&#xff1a; p{font-size:12px;color:red;font-weight:bold; } 使用CSS样式的一个好处是…

hana-banach定理

1. x1不是X除开G以外所有的空间 2.如果极大元不是全空间的话&#xff0c;根据前面的讨论&#xff0c;还可以延拓&#xff0c;这就和极大矛盾了转载于:https://www.cnblogs.com/china520/p/10388862.html

boa服务器实现温湿度显示,SMT车间温湿度分布式远程监控系统的设计

随着SMT生产工艺技术的提高&#xff0c;生产车间对环境的温湿度提出了温度253℃。湿度45&#xff05;RH&#xff5e;65&#xff05;RH的要求。为了达到这样的温湿度要求&#xff0c;就不仅需要提高温湿度传感器的精度&#xff0c;而且要求现场的管理人员能够实时的查看现场的环…

[剑指offer][JAVA]面试题第[09]题[用两个栈实现队列][LinkedList]

【问题描述】[简单] 用两个栈实现一个队列。队列的声明如下&#xff0c;请实现它的两个函数 appendTail 和 deleteHead &#xff0c;分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素&#xff0c;deleteHead 操作返回 -1 )示例 1&#xff1a;输入&am…

html:(23):css代码语法和css注释语法

CSS代码语法 css 样式由选择符和声明组成&#xff0c;而声明又由属性和值组成&#xff0c;如下图所示&#xff1a; 选择符&#xff1a;又称选择器&#xff0c;指明网页中要应用样式规则的元素&#xff0c;如本例中是网页中所有的段&#xff08;p&#xff09;的文字将变成蓝色&…

FFmpeg开发实战(三):FFmpeg 打印音视频Meta信息

在之前使用FFmpeg命令行的时候&#xff0c;我们经常看到FFmpeg命令行在输出音视频文件的会打印一下文件的Meta信息&#xff0c;类似如图&#xff1a; 那么我们如何通过代码的方式输出这些Meta信息呢&#xff1f; FFmpeg提供了一个API专门用来打印多媒体文件的格式 —— av_dump…

html:(24):内联式css和嵌入式css

内联式css样式&#xff0c;直接写在现有的HTML标签中 CSS样式可以写在哪些地方呢&#xff1f;从CSS 样式代码插入的形式来看基本可以分为以下3种&#xff1a;内联式、嵌入式和外部式三种。这一小节先来讲解内联式。 内联式css样式表就是把css代码直接写在现有的HTML标签中&am…

[剑指offer][JAVA]面试题第[10-1]题[斐波那契数列][动态规划][记忆化递归]

【问题描述】[中等] 写一个函数&#xff0c;输入 n &#xff0c;求斐波那契&#xff08;Fibonacci&#xff09;数列的第 n 项。斐波那契数列的定义如下&#xff1a;F(0) 0, F(1) 1 F(N) F(N - 1) F(N - 2), 其中 N > 1. 斐波那契数列由 0 和 1 开始&#xff0c;之后的…

html:(25):选择器定义和标签选择器

什么是选择器&#xff1f; 每一条css样式声明&#xff08;定义&#xff09;由两部分组成&#xff0c;形式如下&#xff1a; 选择器{样式; } 在{}之前的部分就是“选择器”&#xff0c;“选择器”指明了{}中的“样式”的作用对象&#xff0c;也就是“样式”作用于网页中的哪些…

[剑指offer][JAVA]面试题第[64]题[求1+2+…+n][逻辑运算符]

【问题描述】[中等] 求 12...n &#xff0c;要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句&#xff08;A?B:C&#xff09;。输入: n 3 输出: 6【解答思路】 1. 递归&#xff08;不合符题意&#xff09; 时间复杂度&#xff1a;O(N^2) 空间…

html:(26):类选择器和id选择器

类选择器 类选择器在css样式编码中是最常用到的&#xff0c;如右侧代码编辑器中的代码:可以实现为“胆小如鼠”、“勇气”字体设置为红色。 语法&#xff1a; .类选器名称{css样式代码;} 注意&#xff1a; 1、英文圆点开头 2、其中类选器名称可以任意起名&#xff08;但不…

[剑指offer][JAVA]面试题第[10-2]题[青蛙跳台阶问题][动态规划][递归]

【问题描述】[中等] 一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e97&#xff08;1000000007&#xff09;&#xff0c;如计算初始结果为&#xff1a;1000000008&#xff0c;请返回 1。【解答思路…

[剑指offer][JAVA]面试题第[11]题[旋转数组的最小数字][二分法][分治]

【问题描述】[简单] 把一个数组最开始的若干个元素搬到数组的末尾&#xff0c;我们称之为数组的旋转。输入一个递增排序的数组的一个旋转&#xff0c;输出旋转数组的最小元素。例如&#xff0c;数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转&#xff0c;该数组的最小值为1。 示…

html:(27):类和ID选择器的区别和子选择器

类和ID选择器的区别 学习了类选择器和ID选择器&#xff0c;我们会发现他们之间有很多的相似处&#xff0c;是不是两者可以通用呢&#xff1f;我们不要着急先来总结一下他们的相同点和不同点&#xff1a; 相同点&#xff1a;可以应用于任何元素不同点&#xff1a; 1、ID选择器…

对象的释放Dispose和Close对比

C#内存释放的几个方法对比&#xff1a; 而Close与Dispose这两种方法的区别在于&#xff0c;调用完了对象的Close方法后&#xff0c;此对象有可能被重新进行使用&#xff1b;而Dispose方法来说&#xff0c;此对象所占有的资源需要被标记为无用了&#xff0c;也就是此对象被销毁了…

html:(28):后代选择器和通用选择器

包含(后代)选择器 包含选择器&#xff0c;即加入空格,用于选择指定标签元素下的后辈元素。如右侧代码编辑器中的代码&#xff1a; .first span{color:red;} 这行代码会使第一段文字内容中的“胆小如鼠”字体颜色变为红色。 请注意这个选择器与子选择器的区别&#xff0c;子…