算法修炼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).符合单调递减的情况时,全部入栈。

相关文章
|
6天前
|
算法 vr&ar 图形学
☆打卡算法☆LeetCode 223. 矩形面积 算法解析
☆打卡算法☆LeetCode 223. 矩形面积 算法解析
|
7月前
|
算法 测试技术 C#
C++前缀和算法应用:矩形区域不超过 K 的最大数值和
C++前缀和算法应用:矩形区域不超过 K 的最大数值和
|
7月前
|
算法 测试技术 C++
C++算法:柱状图中最大的矩形
C++算法:柱状图中最大的矩形
|
6天前
|
算法
代码随想录算法训练营第六十天 | LeetCode 84. 柱状图中最大的矩形
代码随想录算法训练营第六十天 | LeetCode 84. 柱状图中最大的矩形
24 3
|
5月前
|
人工智能 算法 BI
|
11月前
|
存储 算法
基于链表和禁忌搜索启发式算法实现非一刀切二维矩形排样算法
基于链表和禁忌搜索启发式算法实现非一刀切二维矩形排样算法
77 0
|
机器学习/深度学习 传感器 算法
【排列优化】基于遗传算法实现矩形零件排列问题附matlab代码
【排列优化】基于遗传算法实现矩形零件排列问题附matlab代码
|
机器学习/深度学习 传感器 算法
【二维装箱】基于BL算法求解矩形地块二维装箱放置优化问题附matlab代码
【二维装箱】基于BL算法求解矩形地块二维装箱放置优化问题附matlab代码
|
6天前
|
算法 数据安全/隐私保护 计算机视觉
基于二维CS-SCHT变换和LABS方法的水印嵌入和提取算法matlab仿真
该内容包括一个算法的运行展示和详细步骤,使用了MATLAB2022a。算法涉及水印嵌入和提取,利用LAB色彩空间可能用于隐藏水印。水印通过二维CS-SCHT变换、低频系数处理和特定解码策略来提取。代码段展示了水印置乱、图像处理(如噪声、旋转、剪切等攻击)以及水印的逆置乱和提取过程。最后,计算并保存了比特率,用于评估水印的稳健性。
|
2天前
|
算法
m基于BP译码算法的LDPC编译码matlab误码率仿真,对比不同的码长
MATLAB 2022a仿真实现了LDPC码的性能分析,展示了不同码长对纠错能力的影响。短码长LDPC码收敛快但纠错能力有限,长码长则提供更强纠错能力但易陷入局部最优。核心代码通过循环进行误码率仿真,根据EsN0计算误比特率,并保存不同码长(12-768)的结果数据。
21 9
m基于BP译码算法的LDPC编译码matlab误码率仿真,对比不同的码长