代码随想录算法训练营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分钟

相关推荐
-森屿安年-25 分钟前
647. 回文子串
c++·算法·动态规划
皓月斯语1 小时前
P5736 【深基7.例2】质数筛
c++·算法·题解
极序时代GEO品牌优化2 小时前
杭州极序时代|面向地域、设备与用户画像的动态GEO
人工智能·python·算法·极序时代geo
啦啦啦啦啦zzzz2 小时前
贪心算法和动态规划
c++·算法·贪心算法·动态规划
happyprince3 小时前
篇3:bitsandbytes-深刻观-哲学与升华
人工智能·算法
应用市场3 小时前
红绿灯背后的算法:从 Webster 配时到 Max-Pressure 与强化学习
算法
木井巳3 小时前
【DFS解决floodfill算法】岛屿的最大面积
java·算法·leetcode·深度优先
yyds_yyd_100863 小时前
877. 石子游戏(2026.08.02)& 486. 预测赢家(2026.08.01)
c++·leetcode
m沐沐3 小时前
【机器学习】朴素贝叶斯算法:从贝叶斯定理到手写数字识别实战
人工智能·深度学习·算法·机器学习·计算机视觉·手写数字·数字识别
June`5 小时前
常量内存和只读缓存
c++·人工智能·算法·cuda