【力扣】84. 柱状图中最大的矩形 <模拟、双指针、单调栈>

news/2024/11/7 5:41:32/

目录

    • 【力扣】84. 柱状图中最大的矩形
    • 题解
        • 暴力求解
        • 双指针
        • 单调栈

【力扣】84. 柱状图中最大的矩形

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

示例 1:
在这里插入图片描述

输入:heights = [2,1,5,6,2,3]
输出:10
解释:最大的矩形为图中红色区域,面积为 10

示例 2:
在这里插入图片描述

输入: heights = [2,4]
输出: 4

提示:
1 <= heights.length <= 1 0 5 10^5 105
0 <= heights[i] <= 1 0 4 10^4 104

题解

暴力求解

public static int largestRectangleArea(int[] heights) {int sum = 0;for (int i = 0; i < heights.length; i++) {int left = i;int right = i;//找当前遍历元素之前第一个比它小的元素while (left >= 0) {if (heights[left] < heights[i]) {break;}left--;}//找当前遍历元素之后第一个比它小的元素while (right < heights.length) {if (heights[right] < heights[i]) {break;}right++;}int w = right - left - 1;int h = heights[i];sum = Math.max(sum, w * h);}return sum;
}

双指针

public class Solution {public static int largestRectangleArea(int[] heights) {int[] minLeftIndex = new int[heights.length];int[] minRightIndex = new int[heights.length];// 记录左边第一个小于该柱子的下标minLeftIndex[0] = -1;for (int i = 1; i < heights.length; i++) {int t = i - 1;// 这里不是用if,而是不断向右寻找的过程while (t >= 0 && heights[t] >= heights[i]) {t = minLeftIndex[t];}minLeftIndex[i] = t;}// 记录每个柱子右边第一个小于该柱子的下标minRightIndex[heights.length - 1] = heights.length;for (int i = heights.length - 2; i >= 0; i--) {int t = i + 1;while (t < heights.length && heights[t] >= heights[i]) {t = minRightIndex[t];}minRightIndex[i] = t;}/*for (int a : minLeftIndex) {System.out.println(a);}System.out.println("______________________________");for (int a : minRightIndex) {System.out.println(a);}*/// 求和int result = 0;for (int i = 0; i < heights.length; i++) {int sum = heights[i] * (minRightIndex[i] - minLeftIndex[i] - 1);result = Math.max(sum, result);}return result;}public static void main(String[] args) {int[] heights = {2, 4, 2};System.out.println(largestRectangleArea(heights));}
}

单调栈

注意:单调栈是递减的

class Solution {int largestRectangleArea(int[] heights) {Stack<Integer> st = new Stack<Integer>();// 数组扩容,在头和尾各加入一个元素,防止只递增或者只递减的数组int [] newHeights = new int[heights.length + 2];newHeights[0] = 0;newHeights[newHeights.length - 1] = 0;for (int index = 0; index < heights.length; index++){newHeights[index + 1] = heights[index];}heights = newHeights;st.push(0);int result = 0;// 第一个元素已经入栈,从下标1开始for (int i = 1; i < heights.length; i++) {// 注意heights[i] 是和heights[st.top()] 比较 ,st.top()是下标if (heights[i] > heights[st.peek()]) {st.push(i);} else if (heights[i] == heights[st.peek()]) {st.pop(); // 这个可以加,可以不加,效果一样,思路不同st.push(i);} else {while (heights[i] < heights[st.peek()]) { // 注意是whileint mid = st.peek();st.pop();int left = st.peek();int right = i;int w = right - left - 1;int h = heights[mid];result = Math.max(result, w * h);}st.push(i);}}return result;}
}

http://www.ppmy.cn/news/1059974.html

相关文章

醇音典范 一脉相承! 第五届中国(北京)国际耳机展,索尼期待与你相遇

2023年8月26日至8月27日&#xff0c;第五届中国&#xff08;北京&#xff09;国际耳机展将在北京亚洲大酒店盛大开启。索尼音频产品秉持"For the Music"品牌理念&#xff0c;借助四十余年浸润音乐领域的技术深耕和产业积累&#xff0c;构筑了从声音的录制、制作、到播…

VUE Table表格动态列,数据错位问题

1.首先&#xff0c;检查了前端用于接数据的字段是否与后端传过来的字段相同&#xff0c;在确定传参没有出现问题之后&#xff0c;这个问题仍然存在。 2.发生原因&#xff1a;因为使用了elementui&#xff0c;表格通过循环产生&#xff0c;vue在dom重新渲染时存在一个性能优化机…

聚水潭与金蝶云星空对接集成库存盘点查询打通其他出库单新增V2

聚水潭与金蝶云星空对接集成库存盘点查询打通其他出库单新增V2 来源系统:聚水潭 聚水潭是SaaS协同平台、电商ERP软件。聚水潭成立于2014年&#xff0c;创始人兼CEO骆海东拥有近三十年传统及电商ERP的研发和实施部署经验。聚水潭创建之初&#xff0c;以电商SaaSERP切入市场&…

【C++】—— C++11新特性之 “右值引用和移动语义”

前言&#xff1a; 本期&#xff0c;我们将要的介绍有关 C右值引用 的相关知识。对于本期知识内容&#xff0c;大家是必须要能够掌握的&#xff0c;在面试中是属于重点考察对象。 目录 &#xff08;一&#xff09;左值引用和右值引用 1、什么是左值&#xff1f;什么是左值引用…

基于机器视觉的旋转编码器缺陷检测

基于机器视觉的旋转编码器缺陷检测 1 背景及意义 旋转编码器是用来测量转速并配合PWM技术可以实现快速调速的装置,基本上每一个伺服电机都有一个旋转编码器。旋转编码器的质量将直接影响到伺服电机的好坏,所以每一个旋转编码器出厂前都要经过严格的质检。 传统的检测方法是…

【Atcoder】 [ABC221G] Jumping sequence

题目链接 Atcoder方向 Luogu方向 题目解法 因为上下左右是对横纵坐标分别修改的&#xff0c;不好操作&#xff0c;考虑如何只考虑一维限制 考虑一个重要套路&#xff1a;将坐标轴旋转 45 45\degree 45&#xff0c;这样终点坐标会变为 A B , A − B AB,A-B AB,A−B 然后对…

git操作:将一个仓库的分支提交到另外一个仓库分支

这个操作&#xff0c;一般是同步不同网站的同个仓库&#xff0c;比如说gitee 和github。某个网站更新了&#xff0c;你想同步他的分支过来。然后基于分支开发或者其它。 操作步骤 1.本地先clone 你自己的仓库。也就是要push 分支的仓库。比如A仓库&#xff0c;把B仓库分支&am…

word文档的内部实现原理是什么?

在了解word文档的原理之前&#xff0c;先了解记事本原理。 记事本原理 记事本原理&#xff1a;文件以二进制数据在文件中储存&#xff0c;前几位为编码机制&#xff0c;标识记事本采用了哪一种字符集&#xff0c;后面按照固定位数读取。任何文件的开头都先指定编码&#xff0c…