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

44 阅读2分钟

题目解析:解决“最大矩形面积”问题

思路分析

  1. 遍历所有可能的 k 值:从 k = 1 到 k = n(数组长度),我们需要计算每个 k 值对应的矩形面积。

  2. 计算每个 k 值的矩形面积

    • 对于每个 k,我们需要找到所有可能的起始位置 i,并计算从 i 到 i + k - 1 的子数组的最小值。
    • 用这个最小值乘以 k 得到当前 k 值下的矩形面积。
  3. 更新最大面积:在每次计算完一个 k 值的矩形面积后,更新全局的最大面积。

图解

  • 暴力法

    通过遍历所有可能的 k 值和起始位置,计算每个 k 值对应的矩形面积,时间复杂度为 O(n^3)

  • 单调栈法

    通过维护一个单调递增的栈,可以在 O(n) 时间内找到每个元素作为最小值时的最大矩形面积。

代码详解(暴力法):

public class Main {
    public static int solution(int n, int[] array) {
        int maxArea = 0;
        
        // 遍历所有可能的 k 值
        for (int k = 1; k <= n; k++) {
            // 遍历所有可能的起始位置 i
            for (int i = 0; i <= n - k; i++) {
                int minHeight = array[i];
                // 计算从 i 到 i + k - 1 的最小值
                for (int j = i; j < i + k; j++) {
                    minHeight = Math.min(minHeight, array[j]);
                }
                // 计算当前 k 值下的矩形面积
                int area = minHeight * k;
                // 更新最大面积
                maxArea = Math.max(maxArea, area);
            }
        }
        
        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);
    }
}

数据结构

  • 数组:题目中给定的数组用于存储高度信息,需要对数组进行遍历和操作。
  • :在单调栈方法中,使用栈来维护一个递增的序列,以便在 O(n) 时间内找到每个元素作为最小值时的最大矩形面积。

时间复杂度分析

  • 暴力法:时间复杂度为 O(n^3),因为需要遍历所有可能的 k 值和起始位置,并对每个子数组计算最小值。
  • 单调栈:时间复杂度为 O(n),因为每个元素最多入栈和出栈一次。

问题分解与抽象

  • 问题分解:将问题分解为计算每个 k 值对应的矩形面积,并找到其中的最大值。
  • 抽象思维:通过抽象出单调栈的概念,将问题转化为维护一个递增序列,从而优化计算过程。

这个问题综合考察了算法设计、数据结构、时间复杂度分析、编程技巧以及问题分解与抽象能力。通过解决这个问题,可以加深对这些知识的理解和应用。