AI刷题:最大矩形面积问题 | 豆包MarsCode AI刷题

56 阅读3分钟

问题描述

image.png

代码实现

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 和一个整数数组 arrayn 是数组 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刷题工具对本人的大力支持!!刷题工具对我思路的提醒和指导,是我在代码学习路上的一大助力!今后我也会更加努力,提升自己的编程水平。