最大矩形面积问题(Java) | 豆包MarsCode AI刷题

46 阅读3分钟

问题描述

小S最近在分析一个数组 h1​,h2​,...,hN,数组的每个元素代表某种高度。小S对这些高度感兴趣的是,当我们选取任意 k 个相邻元素时,如何计算它们所能形成的最大矩形面积。

对于 k 个相邻的元素,我们定义其矩形的最大面积为:

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) 的值为这 k 个相邻元素中的最小值乘以 k。现在,小S希望你能帮他找出对于任意 k,R(k) 的最大值。

测试样例

样例1:

输入:n = 5, array = [1, 2, 3, 4, 5]
输出:9

样例2:

输入:n = 6, array = [5, 4, 3, 2, 1, 6]
输出:9

样例3:

输入:n = 4, array = [4, 4, 4, 4]
输出:16

让我们来拆解分析这个问题。

首先,我们需要理解题目要求:对于任意 k 个相邻元素,计算它们所能形成的最大矩形面积。这个面积是这 k 个元素中的最小值乘以 k。

但是要注意,在本题中,提到的矩形仅仅是一个抽象的概念,也就是说无需满足四条边才能构成一个矩形,即k可以取到1,2,3等看似不合逻辑的值。

解题思路

  1. 遍历所有可能的 k 值:从 k=1 到 k=n(数组的长度)。
  2. 对于每个 k 值,遍历数组:计算以每个元素为起点的 k 个相邻元素的最小值,并计算其面积。
  3. 记录最大面积:在每次计算面积时,更新最大面积。

代码编写

我们可以使用双层循环来实现上述思路。外层循环遍历所有可能的 k 值,内层循环遍历数组,计算以每个元素为起点的 k 个相邻元素的最小值,并计算其面积。

public class Main {
    public static int solution(int n, int[] array) {
        int maxArea = 0;

        // 遍历所有可能的 k 值
        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];
                    }
                }
                // 计算面积并更新最大面积
                int area = k * minHeight;
                if (area > maxArea) {
                    maxArea = area;
                }
            }
        }

        return maxArea;
    }

    public static void main(String[] args) {
        // Add your test cases here
        System.out.println(solution(5, new int[]{1, 2, 3, 4, 5}) == 9);
    }
}

关键步骤解释

  1. 外层循环:遍历所有可能的 k 值,从 1 到 n。
  2. 内层循环:遍历数组,计算以每个元素为起点的 k 个相邻元素的最小值。
  3. 计算最小值:在内层循环中,使用一个变量 minHeight 来记录当前 k 个相邻元素的最小值。
  4. 计算面积:使用 k * minHeight 计算面积,并更新最大面积。

本题解答完毕,欢迎各位在评论区讨论自己的思路。