算法修炼Day60|● 84.柱状图中最大的矩形

简介: 算法修炼Day60|● 84.柱状图中最大的矩形
LeetCode:84.柱状图中最大的矩形

84. 柱状图中最大的矩形 - 力扣(LeetCode)

1.思路

双指针思路,以当前数组为中心,借助两个数组存放当前数柱左右两侧小于当前数柱高度的索引,进行h*w的计算。注意首尾节点的左侧索引和右侧索引需要单独声名为0.

单调栈,在原数组的基础上定义一个新的数组,对其进行首尾节点的扩容。思路延续收集雨水。

2.代码实现
class Solution {
  public int largestRectangleArea(int[] heights) {
​    Stack<Integer> stack = new Stack<>();
​    // 数组扩容
​    int[] newHeights = new int[heights.length + 2];
​    newHeights[0] = 0;
​    newHeights[newHeights.length - 1] = 0;
​    for (int i = 0; i < heights.length; i++) {
​      newHeights[i + 1] = heights[i];
​    }
​    heights = newHeights; // 改变数组引用
​    stack.add(0);
​    int result = 0;
​    for (int i = 1; i < heights.length; i++) {
​      if (heights[i] > heights[stack.peek()]) { // 入栈
​        stack.add(i);
​      } else if (heights[i] == heights[stack.peek()]) { 
​        stack.pop(); // 弹出
​        stack.add(i); // 入栈
​      } else {
​        while (heights[i] < heights[stack.peek()]) {
​          int mid = stack.peek(); // 当前数值柱子
​          stack.pop();
​          int left = stack.peek();
​          int right = i;
​          int w = right - left - 1;
​          int h = heights[mid];
​          result = Math.max(result, w * h);
​        }
​        stack.add(i);
​      }
​    }
​    return result;
  }
}
3.复杂度分析:

时间复杂度:O(n).

空间复杂度:O(n).符合单调递减的情况时,全部入栈。

相关文章
|
9月前
|
算法 vr&ar 图形学
☆打卡算法☆LeetCode 223. 矩形面积 算法解析
☆打卡算法☆LeetCode 223. 矩形面积 算法解析
|
算法 测试技术 C#
C++前缀和算法应用:矩形区域不超过 K 的最大数值和
C++前缀和算法应用:矩形区域不超过 K 的最大数值和
|
算法 测试技术 C++
C++算法:柱状图中最大的矩形
C++算法:柱状图中最大的矩形
|
8月前
|
算法 JavaScript 前端开发
在JavaScript中实现基本的碰撞检测算法,我们通常会用到矩形碰撞检测,也就是AABB(Axis-Aligned Bounding Box)碰撞检测
【6月更文挑战第16天】JavaScript中的基本碰撞检测涉及AABB(轴对齐边界框)方法,常用于2D游戏。`Rectangle`类定义了矩形的属性,并包含一个`collidesWith`方法,通过比较边界来检测碰撞。若两矩形无重叠部分,四个条件(关于边界相对位置)均需满足。此基础算法适用于简单场景,复杂情况可能需采用更高级的检测技术或物理引擎库。
133 6
|
4月前
|
算法 C++
【算法单调栈】 矩形牛棚(C/C++)
【算法单调栈】 矩形牛棚(C/C++)
|
8月前
|
算法 Python
二维矩形件排样算法之最低水平线搜索算法实现
二维矩形件排样算法之最低水平线搜索算法实现
245 0
|
8月前
|
机器学习/深度学习 移动开发 算法
二维矩形件排样算法之最低水平线算法实现
二维矩形件排样算法之最低水平线算法实现
170 0
|
9月前
|
算法
代码随想录算法训练营第六十天 | LeetCode 84. 柱状图中最大的矩形
代码随想录算法训练营第六十天 | LeetCode 84. 柱状图中最大的矩形
55 3
|
人工智能 算法 BI
|
2天前
|
算法 数据安全/隐私保护 计算机视觉
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。