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

135 阅读4分钟

569c619c552a02ec68542292e842b5d.png

问题描述

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

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

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) 的值为这 kk 个相邻元素中的最小值乘以 kk。现在,小S希望你能帮他找出对于任意 kk,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

def solution(n, array): max_area = 0 # 初始化最大面积为0

# 遍历窗口大小从1到n
for k in range(1, n + 1):
    window = array[:k]  # 初始化窗口为数组的前k个元素
    current_min = min(window)  # 计算当前窗口的最小值
    max_area = max(max_area, current_min * k)  # 更新最大面积

    # 遍历数组中剩余的元素,逐步移动窗口
    for i in range(k, n):
        # 移除窗口最左边的元素,加入新元素,并更新最小值
        window = window[1:] + [array[i]]
        current_min = min(window)
        max_area = max(max_area, current_min * k)  # 更新最大面积

return max_area  # 返回最大面积

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

print(solution(5, [1, 2, 3, 4, 5]) == 9)
### 问题描述解析

小S有一组数组 h1, h2, ..., hN,每个元素代表某种高度。小S希望找到任意 k 个相邻元素所能形成的最大矩形面积。对于 k 个相邻的元素,其最大矩形面积定义为这 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])

小S希望你能帮他计算出对于任意 k,最大矩形面积的最大值。

测试样例解析

  1. 样例1

    • 输入:n = 5, array = [1, 2, 3, 4, 5]
    • 输出:9
    • 解析:对于 k = 3,选取 [3, 4, 5],最小值为 3,面积为 3 * 3 = 9,这是所有可能的 k 中的最大值。
  2. 样例2

    • 输入:n = 6, array = [5, 4, 3, 2, 1, 6]
    • 输出:9
    • 解析:对于 k = 3,选取 [4, 3, 2],最小值为 2,面积为 2 * 3 = 6;选取 [3, 2, 1],最小值为 1,面积为 1 * 3 = 3;选取 [2, 1, 6],最小值为 1,面积为 1 * 3 = 3。对于 k = 2,选取 [5, 4],最小值为 4,面积为 4 * 2 = 8;选取 [4, 3],最小值为 3,面积为 3 * 2 = 6;选取 [3, 2],最小值为 2,面积为 2 * 2 = 4;选取 [2, 1],最小值为 1,面积为 1 * 2 = 2;选取 [1, 6],最小值为 1,面积为 1 * 2 = 2。对于 k = 1,每个元素的面积为自身值。经过计算,最大面积为 9,出现在 k = 3 时的 [4, 3, 2]
  3. 样例3

    • 输入:n = 4, array = [4, 4, 4, 4]
    • 输出:16
    • 解析:对于 k = 4,选取 [4, 4, 4, 4],最小值为 4,面积为 4 * 4 = 16,这是所有可能的 k 中的最大值。

代码解析

函数定义

def solution(n, array):
    max_area = 0  # 初始化最大面积为0

**

  • 定义一个函数 solution(n, array),接受两个参数:

    • n:数组的长度。
    • array:高度数组。
  • 初始化一个变量 max_area 为 0,用于存储最终的最大矩形面积。

遍历窗口大小

    for k in range(1, n + 1):
        window = array[:k]  # 初始化窗口为数组的前k个元素
        current_min = min(window)  # 计算当前窗口的最小值
        max_area = max(max_area, current_min * k)  # 更新最大面积

**

  • 使用一个 for 循环遍历窗口大小 k,从 1 到 n
  • 对于每个 k,初始化窗口 window 为数组的前 k 个元素。
  • 计算当前窗口的最小值 current_min
  • 计算当前窗口的最大矩形面积 current_min * k,并更新 max_area

遍历数组中剩余的元素,逐步移动窗口

        for i in range(k, n):
            window = window[1:] + [array[i]]  # 移除窗口最左边的元素,加入新元素
            current_min = min(window)  # 更新窗口的最小值
            max_area = max(max_area, current_min * k)  # 更新最大面积

**

  • 使用一个 for 循环遍历数组中剩余的元素,从第 k 个元素到第 n 个元素。
  • 每次移动窗口,移除窗口最左边的元素,加入当前元素 array[i]
  • 更新窗口的最小值 current_min
  • 计算当前窗口的最大矩形面积 current_min * k,并更新 max_area

返回结果

    return max_area  # 返回最大面积

**

  • 返回计算出的最大矩形面积 max_area

主函数解析

if __name__ == "__main__":
    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)

**

  • 主函数用于测试 solution 函数。
  • 使用 print 语句分别测试样例1、样例2和样例3,并输出结果是否与预期相符