问题描述
小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:
- 输入:
n = 5, array = [1, 2, 3, 4, 5] - 输出:
9 - 解析:对于
k = 3,选取[3, 4, 5],最小值为3,面积为3 * 3 = 9,这是所有可能的k中的最大值。
- 输入:
-
样例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:
- 输入:
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,并输出结果是否与预期相符