题目:
挑选一个区间,区间值为区间和 乘以 区间内最小的数 的值,求区间值最大的区间(2021.1 字节跳动-国际化-前端)
思路:
基于leetcode84题:
https://blog.csdn.net/jqq125/article/details/115140257?spm=1001.2014.3001.5501
区别:宽度不同,宽度不再是1,而是高度。
相当于柱状图中,每个柱都是一个正方形,边长为所给的高。
解答:
class Solution:
def largestRectangleArea(self, heights):
size = len(heights)
res = 0
heights = [0] + heights + [0]
# 先放入哨兵结点,在循环中就不用做非空判断
stack = [0]
size += 2
for i in range(1, size):
while heights[i] < heights[stack[-1]]:
cur_height = heights[stack.pop()]
#cl为当前区间的左端点,i-1为当前区间的右端点
#cur_height为当前区间的高度
cl=stack[-1]+1
cur_width = sum(heights[cl:i])
print(cl,i,cur_height,cur_width,cur_height*cur_width)
res = max(res, cur_height * cur_width)
stack.append(i)
return res
if __name__ == '__main__':
heights = [2, 1, 5, 6, 2, 3]
solution = Solution()
res = solution.largestRectangleArea(heights)
print(res)
运行结果: