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

77 阅读3分钟

问题描述

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

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

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

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


测试样例

样例1:

输入:n = 5, array = [1, 2, 3, 4, 5]
输出:9

样例2:

输入:n = 6, array = [5, 4, 3, 2, 1, 6]
输出:9

样例3:

输入:n = 4, array = [4, 4, 4, 4]
输出:16

问题理解

你需要计算一个数组中任意 k 个相邻元素所能形成的最大矩形面积。矩形的面积定义为这 k 个元素中的最小值乘以 k

思路分析

  • 使用滑动窗口技术,遍历数组中所有可能的 k 个相邻元素。(k的长度<=数组长度)

  • 计算每个窗口的最小值,并乘以 k 得到当前窗口的面积。

  • 用当前面积与最大面积相比较,更新最大面积

Python代码展示

def solution(n, array):
    max_area = 0
    for k in range(1,n+1):
        for i in range(n-k+1):
            min_heiget = min(array[i:i+k])
            area=k*min_heiget
            max_area=max(max_area,area)
    return max_area

重点代码块

for k in range(1,n+1):
        for i in range(n-k+1):
            min_heiget = min(array[i:i+k])
  • for k in range(1, n + 1):

外层循环,用于遍历不同长度的子数组,k表示子数组的长度,从1开始到n。

  • for i in range(n - k + 1):

内层循环,用于在原数组中滑动选取长度为k的子数组i表示子数组起始位置的索引,范围是从0到n - k,保证能取到长度为k的子数组。

  • min_heiget = min(array[i:i + k])

取出当前长度为k的子数组,并找到其中的最小高度值,因为以这个子数组构建矩形时,高度受限于最小高度值。

示例

输入:n = 5, array = [1, 2, 3, 4, 5]
输出:9

逐步计算
  1. k = 1

    • 所有可能的子数组:[1][2][3][4][5]
    • 最小值:12345
    • 面积:1 * 1 = 12 * 1 = 23 * 1 = 34 * 1 = 45 * 1 = 5
    • 最大面积:5
  2. k = 2

    • 所有可能的子数组:[1, 2][2, 3][3, 4][4, 5]
    • 最小值:1234
    • 面积:2 * 1 = 22 * 2 = 42 * 3 = 62 * 4 = 8
        • 最大面积:8
  3. k = 3

    • 所有可能的子数组:[1, 2, 3][2, 3, 4][3, 4, 5]
    • 最小值:123
    • 面积:3 * 1 = 33 * 2 = 63 * 3 = 9
    • 最大面积:9
  4. k = 4

    • 所有可能的子数组:[1, 2, 3, 4][2, 3, 4, 5]
    • 最小值:12
    • 面积:4 * 1 = 44 * 2 = 8
    • 最大面积:8
  5. k = 5

    • 所有可能的子数组:[1, 2, 3, 4, 5]
    • 最小值:1
    • 面积:5 * 1 = 5
    • 最大面积:5

最终结果

通过上述计算,我们可以看到当 k = 3 时,子数组 [3, 4, 5] 的最小值为 3,面积为 3 * 3 = 9,这是所有可能的 k 值中最大的面积。 因此,输入 n = 5, array = [1, 2, 3, 4, 5] 时,输出结果为 9