代码随想录算法训练营19期第60天

84.柱状图中最大的矩形

代码随想录

初步思路:接雨水

总结:

  • 接雨水那道题是找每个柱子左右两边第一个大于该柱子高度的柱子,所以单调栈从栈头(元素从栈头弹出)到栈底的顺序应该是从小到大的顺序。
  • 本题是找每个柱子左右两边第一个小于该柱子的柱子,所以单调栈从栈头(元素从栈头弹出)到栈底的顺序应该是从大到小的顺序。
  • 输入数组首尾各补上一个0(与接雨水不同的是,本题原首尾的两个柱子可以作为核心柱进行最大面积尝试)
python 复制代码
def largestRectangleArea(self, heights: List[int]) -> int:

        '''

        找每个柱子左右侧的第一个高度值小于该柱子的柱子

        单调栈:栈顶到栈底:从大到小(每插入一个新的小数值时,都要弹出先前的大数值)

        栈顶,栈顶的下一个元素,即将入栈的元素:这三个元素组成了最大面积的高度和宽度

        情况一:当前遍历的元素heights[i]大于栈顶元素的情况

        情况二:当前遍历的元素heights[i]等于栈顶元素的情况

        情况三:当前遍历的元素heights[i]小于栈顶元素的情况

        '''

        heights.insert(0, 0)

        heights.append(0)

        stack = [0]

        result = 0

        for i in range(1, len(heights)):

            # 情况一

            if heights[i] > heights[stack[-1]]:

                stack.append(i)

            # 情况二

            elif heights[i] == heights[stack[-1]]:

                stack.pop()

                stack.append(i)

            # 情况三

            else:

                # 抛出所有较高的柱子

                while stack and heights[i] < heights[stack[-1]]:

                    # 栈顶就是中间的柱子,主心骨

                    mid_index = stack[-1]

                    stack.pop()

                    if stack:

                        left_index = stack[-1]

                        right_index = i

                        width = right_index - left_index - 1

                        height = heights[mid_index]

                        result = max(result, width * height)

                stack.append(i)

        return result

用时:60分钟

相关推荐
Swift社区19 小时前
LeetCode 399 除法求值
算法·leetcode·职场和发展
仰泳的熊猫19 小时前
LeetCode:98. 验证二叉搜索树
数据结构·c++·算法·leetcode
JAVA学习通20 小时前
零基础OSS组件(Java)
java·linux·leetcode
Python智慧行囊20 小时前
图像处理(三)--开运算与闭运算,梯度运算,礼帽与黑帽
人工智能·算法·计算机视觉
前端小L20 小时前
动态规划的“细节魔鬼”:子序列 vs 子数组 —— 最长重复子数组
算法·动态规划
草莓熊Lotso20 小时前
《算法闯关指南:优选算法--二分查找》--19.x的平方根,20.搜索插入位置
java·开发语言·c++·算法
sali-tec20 小时前
C# 基于halcon的视觉工作流-章46-不匀面划痕
人工智能·算法·计算机视觉·c#
yuniko-n21 小时前
【力扣 SQL 50】连接
数据库·后端·sql·算法·leetcode
胖咕噜的稞达鸭21 小时前
算法入门:专题二---滑动窗口(长度最小的子数组)更新中
c语言·数据结构·c++·算法·推荐算法
海洲探索-Hydrovo1 天前
TTP Aether X 天通透传模块丨国产自主可控大数据双向通讯定位模组
网络·人工智能·科技·算法·信息与通信