问题描述
代码实现
public class Main {
public static int solution(int n, int[] array) {
int maxArea = 0;
// 遍历每一个可能的起始位置
for (int i = 0; i < n; i++) {
int minHeight = array[i];
// 从当前位置开始,尝试扩展矩形的宽度
for (int j = i; j < n; j++) {
// 更新最小高度
minHeight = Math.min(minHeight, array[j]);
// 计算当前矩形的面积
int currentArea = (j - i + 1) * minHeight;
// 更新最大面积
maxArea = Math.max(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[]{5, 4, 3, 2, 1, 6}) == 9);
System.out.println(solution(4, new int[]{4, 4, 4, 4}) == 16);
}
}
代码讲解
这段代码定义了一个名为 Main 的公共类,其中包含两个静态方法:solution 和 main。
solution 方法
-
参数:接收一个整数
n和一个整数数组array。n是数组array的长度(尽管这个参数在方法内部没有被直接使用,因为数组的长度可以通过array.length获取)。 -
目的:找出由数组
array中的元素形成的最大矩形面积,其中矩形的宽度由数组中连续的元素决定,高度由这些元素中的最小值决定。 -
实现:
- 初始化一个变量
maxArea为 0,用于存储最大矩形面积。 - 使用两层循环遍历数组中的所有可能的矩形。外层循环确定矩形的起始位置,内层循环从起始位置开始尝试扩展矩形的宽度。
- 在内层循环中,使用变量
minHeight来跟踪当前矩形范围内的最小高度。 - 计算当前矩形的面积,即宽度(
j - i + 1)乘以最小高度(minHeight)。 - 更新
maxArea,如果当前面积大于maxArea。
- 初始化一个变量
main 方法
-
目的:测试
solution方法是否正确。 -
实现:通过调用
solution方法并传入不同的数组和长度(尽管长度是多余的,因为可以从数组中获取),然后打印出方法返回的结果是否等于预期的最大矩形面积。- 第一个测试用例检查数组
{1, 2, 3, 4, 5}是否能正确计算出最大矩形面积为 9(由元素2, 3, 4形成的矩形)。 - 第二个测试用例检查数组
{5, 4, 3, 2, 1, 6}是否能正确计算出最大矩形面积为 9(同样由元素2, 3, 4或其他三个连续递减的元素形成的矩形)。 - 第三个测试用例检查数组
{4, 4, 4, 4}是否能正确计算出最大矩形面积为 16(整个数组形成的矩形)。
- 第一个测试用例检查数组
代码的缺陷
代码的目的是实现一个算法,该算法能够找出由给定整数数组中的元素形成的最大矩形面积,其中矩形的宽度和高度由数组中的连续元素及其最小值决定。尽管提供的代码可以正确解决问题,但其时间复杂度为 O(n^2),所以我认为在数组较大时可能不够高效。对于更大的数据集,更高效的算法(如使用单调栈)可能会更受欢迎。由于本人水平目前并不高深,日后一定会努力精进算法。同时也感谢ai刷题工具对本人的大力支持!!刷题工具对我思路的提醒和指导,是我在代码学习路上的一大助力!今后我也会更加努力,提升自己的编程水平。