最大矩形面积问题求解 | 豆包MarsCode AI刷题

124 阅读2分钟

问题描述

小S最近在分析一个数组 h1​,h2​,...,hN​ ,数组的每个元素代表某种高度。小S对这些高度感兴趣的是,当我们选取任意 k 个相邻元素时,如何计算它们所能形成的最大矩形面积。

对于 k 个相邻的元素,我们定义其矩形的最大面积为:

R(k)=k×min(h[i],h[i+1],...,h[i+k−1])

即,R(k) 的值为这 k 个相邻元素中的最小值乘以 k。现在,小S希望你能帮他找出对于任意 k,R(k) 的最大值。

问题解析

需要在一个数组中找到任意 k 个相邻元素所能形成的最大矩形面积。这个矩形面积的计算方式是:k 个相邻元素中的最小值乘以 k

数据结构选择

  • 数组:用于存储高度值。
  • 滑动窗口:用于动态计算 k 个相邻元素的最小值。

算法步骤

  1. 遍历所有可能的 k 值:从 1 到 n(数组长度)。

  2. 对于每个 k 值

    • 使用滑动窗口遍历数组,计算每个窗口的最小值。
    • 计算当前窗口的最小值乘以 k,得到当前窗口的矩形面积。
    • 更新最大矩形面积。
  3. 返回最大矩形面积

代码

def solution(n, array):
    max_s = 0
    for k in range(1, n + 1):
        max_r = 0
        for i in range(0, n + 1 - k):
            r = min(array[i:i + k])   #当前窗口最小值
            if r > max_r:
                max_r = r
        s = k * max_r
        if s > max_s:
            max_s = s
    return max_s

优化思路

  • 单调栈:可以使用单调栈来优化计算最小值的过程,从而减少时间复杂度。

总结

通过遍历所有可能的 k 值,并使用滑动窗口或单调栈来计算每个窗口的最小值,可以有效地找到最大矩形面积。