青训营X豆包MarsCode技术训练营最大矩形面积问题 | 豆包MarsCode AI刷题

37 阅读3分钟

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

对于 k 个相邻的元素,我们定义其矩形的最大面积为:R(k)=k×min(h[i],h[i+1],...,h[i+k−1])

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

我们需要在一个数组中找到任意 k 个相邻元素所能形成的最大矩形面积。矩形的面积定义为这 k 个相邻元素中的最小值乘以 k。目标是找到对于任意 k,R(k) 的最大值。 数据结构选择 数组:用于存储输入的高度值。 变量:用于存储当前的最大面积。 算法步骤 遍历所有可能的 k 值: 从 1 到 n,表示选取的相邻元素个数。 遍历数组,计算每个 k 个相邻元素的矩形面积: 对于每个 k,遍历数组,计算每个 k 个相邻元素的矩形面积。 计算当前 k 个相邻元素的最小值: 使用 min 函数计算当前 k 个相邻元素的最小值。 计算当前 k 个相邻元素的矩形面积: 面积等于 k 乘以最小值。 更新最大面积: 使用 max 函数更新最大面积。 优化思路 暴力解法:上述步骤是一个暴力解法,时间复杂度为 O(n^2)。 单调栈优化:可以使用单调栈来优化计算过程,将时间复杂度降低到 O(n)。 单调栈优化 单调栈:维护一个单调递增的栈,栈中存储数组元素的索引。 计算面积: 当栈顶元素的高度小于当前元素的高度时,入栈。 当栈顶元素的高度大于等于当前元素的高度时,弹出栈顶元素,并计算以栈顶元素为高度的矩形面积。 计算面积时,宽度为当前元素索引与新栈顶元素索引的差值。

Python: def solution(n, array): max_area = 0

# 遍历所有可能的 k 值
for k in range(1, n + 1):
    # 遍历数组,计算每个 k 个相邻元素的矩形面积
    for i in range(n - k + 1):
        # 计算当前 k 个相邻元素的最小值
        min_height = min(array[i:i + k])
        # 计算当前 k 个相邻元素的矩形面积
        area = k * min_height
        # 更新最大面积
        max_area = max(max_area, area)

return max_area

if name == "main": # Add your test cases here

print(solution(5, [1, 2, 3, 4, 5]) == 9)
print(solution(6, [5, 4, 3, 2, 1, 6]) == 9)
print(solution(4, [4, 4, 4, 4]) == 16)

总结 暴力解法:适用于小规模数据,简单易懂。 单调栈优化:适用于大规模数据,时间复杂度更低。