欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 会展 > 代码随想录算法训练营Day 60| 单调栈part03| 84.柱状图中最大的矩形

代码随想录算法训练营Day 60| 单调栈part03| 84.柱状图中最大的矩形

2025/10/20 11:34:29 来源:https://blog.csdn.net/m0_51759998/article/details/139594591  浏览:    关键词:代码随想录算法训练营Day 60| 单调栈part03| 84.柱状图中最大的矩形

代码随想录算法训练营Day 60| 单调栈part03| 84.柱状图中最大的矩形


文章目录

  • 代码随想录算法训练营Day 60| 单调栈part03| 84.柱状图中最大的矩形
  • 84.柱状图中最大的矩形
    • 一、双指针 向左向右找第一个矮一级的柱子下标
    • 二、单调栈


84.柱状图中最大的矩形

题目链接

一、双指针 向左向右找第一个矮一级的柱子下标

# 双指针 
class Solution:def largestRectangleArea(self, heights: List[int]) -> int:size = len(heights)# 两个DP数列储存的均是下标indexmin_left_index = [0] * sizemin_right_index = [0] * sizeresult = 0# 记录每个柱子的左侧第一个矮一级的柱子的下标min_left_index[0] = -1  # 初始化防止while死循环for i in range(1, size):# 以当前柱子为主心骨,向左迭代寻找次级柱子temp = i - 1while temp >= 0 and heights[temp] >= heights[i]:# 当左侧的柱子持续较高时,尝试这个高柱子自己的次级柱子(DPtemp = min_left_index[temp] # temp -= 1超时# 当找到左侧矮一级的目标柱子时min_left_index[i] = temp# 记录每个柱子的右侧第一个矮一级的柱子的下标min_right_index[size-1] = size  # 初始化防止while死循环for i in range(size-2, -1, -1):# 以当前柱子为主心骨,向右迭代寻找次级柱子temp = i + 1while temp < size and heights[temp] >= heights[i]:# 当右侧的柱子持续较高时,尝试这个高柱子自己的次级柱子(DPtemp = min_right_index[temp] # temp += 1超时# 当找到右侧矮一级的目标柱子时min_right_index[i] = tempfor i in range(size):area = heights[i] * (min_right_index[i] - min_left_index[i] - 1)result = max(area, result)return result

二、单调栈

        '''# 单调栈# 输入数组首尾各补上一个0(与42.接雨水不同的是,本题原首尾的两个柱子可以作为核心柱进行最大面积尝试heights.insert(0, 0)heights.append(0)stack = [0]res=0for i in range(1,len(heights)):while stack and heights[i]<heights[stack[-1]]: mid = stack.pop() #求高度if stack:width = i - stack[-1] - 1  # 注意栈顶现在是mid弹出后的栈顶元素,代表左边界,i为右边界res = max(res, width * heights[mid])stack.append(i)return res

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词