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

相关推荐
啊哦呃咦唔鱼1 分钟前
LeetCode hot100-240搜索二维矩阵 II
算法
Q741_1472 分钟前
力扣高频面试题详解 数组 链表 力扣 56.合并区间 力扣 160.相交链表 C++ 每日练习
c++·算法·leetcode·链表·数组·哈希
2301_7938046910 分钟前
C++中的备忘录模式
开发语言·c++·算法
ab15151712 分钟前
3.23完成进阶45、84,二刷基础132、129
算法·深度优先·图论
CoovallyAIHub13 分钟前
编码智能体做 CV 任务,实际能力到哪一步了?——五项视觉任务实测解读
深度学习·算法·计算机视觉
2501_9454235415 分钟前
C++编译期多态实现
开发语言·c++·算法
2401_8796938715 分钟前
设计模式在C++中的实现
开发语言·c++·算法
☆56618 分钟前
C++中的代理模式高级应用
开发语言·c++·算法
2301_8184190120 分钟前
编译器命令选项优化
开发语言·c++·算法
m0_5180194820 分钟前
C++图形编程(OpenGL)
开发语言·c++·算法