【面试题】字节跳动-区间值最大的区间

461 篇文章 1 订阅

题目:
挑选一个区间,区间值为区间和 乘以 区间内最小的数 的值,求区间值最大的区间(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)

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值