青训营X豆包MarsCode 技术训练营第五课 | 豆包MarsCode AI 刷题

23 阅读3分钟

最大矩形面积问题

小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.思路分析:

本题的目标是找出对于任意 k(从 1 到数组长度 n),按照给定规则计算出的 R(k) 的最大值。整体思路采用了双层循环的暴力解法。外层循环用于遍历所有可能的 k 值,范围是从 1 到 n,因为 k 表示选取相邻元素的个数,最小可以取 1(即只选一个元素时),最大可以取整个数组的长度 n(即选取全部元素时)。对于每一个确定的 k 值,内层循环用来遍历所有可能的起始位置 i,起始位置 i 的范围是从 0 到 n - k,这样能保证从 i 开始往后取 k 个元素不会超出数组边界。在每一个起始位置 i 下,先通过 min 函数找出从 i 开始的 k 个相邻元素中的最小值 min_height,然后按照公式 R(k) = k × min(h[i], h[i + 1],..., h[i + k - 1]) 计算出对应的面积 area,最后将这个面积和当前记录的最大面积 max_area 进行比较,如果 area 大于 max_area,就更新 max_area 的值,如此遍历完所有的 k 值和对应的起始位置后,最终 max_area 就是所求的对于任意 k,R(k) 的最大值。

2.知识总结:

双层循环解决组合问题的思路:本题运用了典型的双层循环结构,外层循环控制一种维度(这里是相邻元素的个数 k),内层循环控制另一种维度(这里是起始位置 i),通过这样的嵌套循环来遍历所有可能的组合情况,在处理很多需要考虑多种维度变化的问题时经常用到。
利用切片和 min 函数求子序列最小值:代码中使用切片操作 array[i:i + k] 很方便地获取了数组中指定范围(从 i 开始的 k 个元素)的子序列,然后结合 min 函数快速求出这个子序列中的最小值,切片操作可以灵活地获取数组的部分元素,min 函数能便捷地处理求最值问题,在实际编程中经常会用到这两个功能来对数组元素进行操作和分析。
通过比较更新最值变量的方法:使用 if area > max_area: 这样的条件判断语句来比较计算出的当前值(这里是面积 area)和已记录的最值变量(这里是最大面积 max_area),如果满足条件就更新最值变量,这种通过不断比较来动态更新最值的方式是编程中处理求最值问题的一种基本且常用的方法,要理解如何正确地设置比较条件以及更新操作,确保能准确找到整个过程中的最值。