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

19 阅读3分钟

最大矩形面积问题

问题描述

小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);
    }
}

代码逻辑解释

  1. 遍历所有可能的k值

    • 我们从1到n遍历所有可能的k值。k代表我们要考虑的相邻元素的数量。
    • 对于每个k值,我们需要计算所有可能的k个相邻元素的最大矩形面积。
  2. 遍历数组

    • 对于每个k值,我们遍历数组,计算以每个元素为起点的k个相邻元素的最大面积。
    • 具体来说,我们从数组的第一个元素开始,直到倒数第k个元素,这样可以确保我们有足够的元素来形成k个相邻元素。
  3. 找到最小高度

    • 在当前k个相邻元素中,我们需要找到最小的高度。这个最小高度将用于计算矩形的面积。
    • 我们通过遍历当前k个相邻元素,找到其中的最小值。
  4. 计算当前面积

    • 一旦我们找到了当前k个相邻元素的最小高度,我们就可以计算这k个元素所能形成的最大矩形面积。
    • 这个面积等于k乘以最小高度。
  5. 更新最大面积

    • 我们将当前计算的面积与已知的最大面积进行比较。
    • 如果当前面积大于已知的最大面积,则更新最大面积。

测试用例

  • main函数中,我们添加了两个测试用例来验证代码的正确性。
  • 第一个测试用例是[1, 2, 3, 4, 5],预期输出是9。
  • 第二个测试用例是[2, 1, 5, 6, 2, 3],预期输出是10。

总结

  • 这个算法的核心思想是通过遍历所有可能的k值和数组中的每个起点,找到k个相邻元素的最小高度,并计算其最大矩形面积。
  • 通过不断更新最大面积,我们最终得到的是对于所有可能的k值,k个相邻元素所能形成的最大矩形面积。