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

35 阅读3分钟

题目解析 我们给定一个数组 heights,其中每个元素代表一种高度。对于数组中任意连续的 k 个相邻元素,要计算它们所能形成的最大矩形面积。定义这个矩形面积 R(k)k 乘以这 k 个相邻元素中的最小值。我们的任务就是找出对于所有可能的 kR(k) 的最大值。

 ### 解题步骤

1. 暴力解法思路(不推荐,但有助于理解问题): - 我们可以通过两层嵌套的循环来遍历所有可能的连续 k 个元素的组合。外层循环用于确定起始位置 i,内层循环用于从起始位置开始选取连续的 k 个元素。 - 对于每一组连续的 k 个元素,我们找到其中的最小值 min_height,然后计算面积 area = k * min_height。 - 在遍历完所有可能的组合后,我们就能找到最大的面积值。 - 然而,这种方法的时间复杂度非常高,是 O(n^2),其中 n 是数组的长度,因为我们需要对每个可能的子数组都进行计算。

2. 优化解法思路(使用单调栈): - 我们可以利用单调栈来解决这个问题。单调栈是一种特殊的数据结构,在本题中,我们维护一个单调递增的栈。 - 首先,我们在数组 heights 的两端分别添加一个高度为0的虚拟元素,这有助于简化边界处理。 - 然后,我们遍历数组(包括虚拟元素),对于每个元素 height: - 当栈不为空且当前元素小于栈顶元素对应的高度时,我们弹出栈顶元素,并计算以栈顶元素为高度的矩形面积。 - 计算面积时,我们需要知道矩形的宽度。宽度可以通过当前索引与栈顶元素弹出后栈顶的新索引之差来确定。 - 我们持续弹出栈顶元素并计算面积,直到栈为空或者当前元素不小于栈顶元素对应的高度。 - 最后,我们将当前元素的索引压入栈中。 - 在遍历完整个数组后,我们就可以得到所有可能的矩形面积,从中找出最大值即可。 ### Python代码实现

def max_rectangular_area(heights):  

    stack = []  

    n = len(heights)  

    left = [0] * n  

    right = [n] * n  

    max_area = 0  

     

    # 计算每个元素左边第一个比它小的元素的位置  

    for i in range(n):  

        while stack and heights[stack[-1]] >= heights[i]:  

            stack.pop()  

        left[i] = stack[-1] if stack else -1  

        stack.append(i)  

     

    stack = []  

     

    # 计算每个元素右边第一个比它小的元素的位置  

    for i in range(n - 1, -1, -1):  

        while stack and heights[stack[-1]] >= heights[i]:  

            stack.pop()  

        right[i] = stack[-1] if stack else n  

        stack.append(i)  

     

    # 计算以每个元素为最小值的最大矩形面积,并更新全局最大值  

    for i in range(n):  

        area = heights[i] * (right[i] - left[i] - 1)  

        max_area = max(max_area, area)  

     

    return max_area  

 

def solution(n, array):  

    # 直接调用上面的函数来计算最大矩形面积  

    return max_rectangular_area(array)  

 

测试结果 我们可以使用以下方式来测试代码:

python # 示例数组 heights_example = [2, 1, 5, 6, 2, 3] result = max_rectangular_area(heights_example) print("最大矩形面积:", result) 在上述示例中,对于数组 [2, 1, 5, 6, 2, 3],运行代码后会输出最大矩形面积的值。你可以根据需要修改示例数组来测试不同的输入情况。 通过上述代码,我们能够高效地找出给定数组中任意连续 k 个相邻元素所能形成的最大矩形面积的最大值。