最大矩形面积问题
问题描述
小S最近在分析一个数组 h1,h2,...,hN,数组的每个元素代表某种高度。小S对这些高度感兴趣的是,当我们选取任意 k 个相邻元素时,如何计算它们所能形成的最大矩形面积。
对于 k 个相邻的元素,我们定义其矩形的最大面积为:
R(k)=k×min(h[i],h[i+1],...,h[i+k−1])
即,R(k) 的值为这 k 个相邻元素中的最小值乘以 k。现在,小S希望你能帮他找出对于任意 k,R(k) 的最大值。
代码实现
public class Main {
public static int solution(int n, int[] array) {
int maxArea = 0;
// 遍历所有可能的k值,从1到n
for (int k = 1; k <= n; k++) {
// 遍历数组,计算以每个元素为起点的k个相邻元素的最大面积
for (int i = 0; i <= n - k; i++) {
int minHeight = array[i];
// 找到这k个元素中的最小高度
for (int j = 1; j < k; j++) {
if (array[i + j] < minHeight) {
minHeight = array[i + j];
}
}
// 计算当前k个相邻元素的最大面积
int currentArea = k * minHeight;
// 更新最大面积
if (currentArea > maxArea) {
maxArea = currentArea;
}
}
}
return maxArea;
}
public static void main(String[] args) {
// 测试用例
System.out.println(solution(5, new int[]{1, 2, 3, 4, 5}) == 9);
System.out.println(solution(6, new int[]{2, 1, 5, 6, 2, 3}) == 10);
}
}
代码逻辑解释
-
遍历所有可能的k值:
- 我们从1到n遍历所有可能的k值。k代表我们要考虑的相邻元素的数量。
- 对于每个k值,我们需要计算所有可能的k个相邻元素的最大矩形面积。
-
遍历数组:
- 对于每个k值,我们遍历数组,计算以每个元素为起点的k个相邻元素的最大面积。
- 具体来说,我们从数组的第一个元素开始,直到倒数第k个元素,这样可以确保我们有足够的元素来形成k个相邻元素。
-
找到最小高度:
- 在当前k个相邻元素中,我们需要找到最小的高度。这个最小高度将用于计算矩形的面积。
- 我们通过遍历当前k个相邻元素,找到其中的最小值。
-
计算当前面积:
- 一旦我们找到了当前k个相邻元素的最小高度,我们就可以计算这k个元素所能形成的最大矩形面积。
- 这个面积等于k乘以最小高度。
-
更新最大面积:
- 我们将当前计算的面积与已知的最大面积进行比较。
- 如果当前面积大于已知的最大面积,则更新最大面积。
测试用例
- 在
main函数中,我们添加了两个测试用例来验证代码的正确性。 - 第一个测试用例是
[1, 2, 3, 4, 5],预期输出是9。 - 第二个测试用例是
[2, 1, 5, 6, 2, 3],预期输出是10。
总结
- 这个算法的核心思想是通过遍历所有可能的k值和数组中的每个起点,找到k个相邻元素的最小高度,并计算其最大矩形面积。
- 通过不断更新最大面积,我们最终得到的是对于所有可能的k值,k个相邻元素所能形成的最大矩形面积。