问题描述
小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
思路分析
题目要求我们计算一个数组中任意 k 个相邻元素所能形成的最大矩形面积。这个面积是这 k 个元素中的最小值乘以 k。我们需要找到对于所有可能的 k 值,这个面积的最大值。根据豆包的提示,我们有以下分析:
数据结构选择
- 数组:我们使用数组来存储输入的高度值。
- 变量:我们需要一个变量来记录当前的最大面积。
算法步骤
- 遍历所有可能的
k值:从1到n(数组的长度)。 - 对于每个
k值,遍历数组:计算以每个元素为起点,长度为k的子数组的最小值,并计算其面积。 - 记录最大面积:在每次计算面积时,更新最大面积。
详细步骤
-
初始化最大面积:使用一个变量
max_area来记录当前的最大面积,初始值为0。 -
外层循环遍历
k:从1到n。-
内层循环遍历数组:从
0到n - k。- 计算当前子数组的最小值:使用
min函数计算从当前元素到当前元素加上k个元素的最小值。 - 计算当前子数组的面积:将最小值乘以
k。 - 更新最大面积:如果当前面积大于
max_area,则更新max_area。
- 计算当前子数组的最小值:使用
-
-
返回最大面积:在遍历完所有可能的
k值后,返回max_area。
优化思路
- 滑动窗口:在计算最小值时,可以考虑使用滑动窗口来减少重复计算。
- 单调栈:使用单调栈来快速找到每个元素作为最小值时的最大矩形面积。
通过上述步骤,可以逐步计算出对于每个 k 值的最大矩形面积,并最终找到全局的最大面积。
AC代码:
def solution(n, array):
max_area = 0 # 用于记录最大面积
# 遍历所有可能的 k 值
for k in range(1, n + 1):
# 遍历数组,计算以每个元素为起点,长度为 k 的子数组的最小值
for i in range(n - k + 1):
# 计算当前子数组的最小值
min_height = min(array[i:i + k])
# 计算当前子数组的面积
current_area = k * min_height
# 更新最大面积
if current_area > max_area:
max_area = current_area
return max_area