学习方法与心得 1| 豆包MarsCode AI刷题

100 阅读4分钟

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

问题描述:

给定一个数组 h = [h1, h2, ..., hN],每个元素代表一个高度。对于任意 k 个相邻的元素,计算它们所能形成的最大矩形面积。该矩形的最大面积定义为:

R(k)=k×min⁡(h[i],h[i+1],...,h[i+k−1])R(k) = k \times \min(h[i], h[i+1], ..., h[i+k-1])R(k)=k×min(h[i],h[i+1],...,h[i+k−1])

其中 k 为选择的相邻元素的个数,min() 为这 k 个元素中的最小值。我们需要找出对于任意 kR(k) 的最大值。


思路解析

这个问题本质上是要求计算每个长度为 k 的相邻元素组成的矩形的最大面积。可以按照以下步骤进行求解:

  1. 选择相邻元素:遍历所有可能的 k 个相邻元素,即从 k = 1n,对于每个 k,从 i = 0n-k,遍历数组中的所有 k 长度的子数组。
  2. 计算每个子数组的矩形面积:对于每个子数组,找出该子数组中的最小值,计算面积 area = k * min_height,其中 k 为当前子数组的长度,min_height 为该子数组中的最小高度。
  3. 更新最大面积:在每次计算矩形面积时,更新最大面积 max_area
  4. 输出最大面积:返回计算出的最大矩形面积。

代码解析

python
def solution(n, array):
    max_area = 0  # 用于记录最大矩形面积
    for k in range(1, n + 1):  # k从1到n
        for i in range(n - k + 1):  # i是子数组的起始位置
            min_height = min(array[i:i + k])  # 找到当前子数组的最小值
            area = k * min_height  # 计算矩形面积
            max_area = max(max_area, area)  # 更新最大面积
    return max_area  # 返回最大面积

优化思路

当前的解法的时间复杂度为 O(n^3),因为对于每个 k,我们在子数组中计算最小值,并计算矩形面积。这会导致大量重复计算。为了提高效率,我们可以采用以下优化方案:

  1. 减少重复计算: 使用单调栈(Monotonic Stack)来高效求解每个位置的最大矩形面积,而不是反复计算子数组的最小值。
  2. 单调栈优化: 通过栈来维护一个递增的高度序列,避免了每次计算最小值的重复操作。栈中的元素代表数组的索引,可以在线性时间内找到每个位置的最大矩形面积。

单调栈法优化

python
def solution(n, array):
    stack = []  # 存储索引
    max_area = 0  # 记录最大矩形面积

    # 遍历所有高度
    for i in range(n):
        # 如果栈非空且当前元素小于栈顶元素,计算以栈顶元素为最小高度的矩形
        while stack and array[stack[-1]] > array[i]:
            h = array[stack.pop()]  # 弹出栈顶元素,作为矩形的最小高度
            w = i if not stack else i - stack[-1] - 1  # 计算宽度
            max_area = max(max_area, h * w)  # 更新最大矩形面积
        stack.append(i)  # 将当前索引压入栈中
    
    # 处理栈中剩余的元素
    while stack:
        h = array[stack.pop()]
        w = n if not stack else n - stack[-1] - 1
        max_area = max(max_area, h * w)
    
    return max_area

优化后的时间复杂度分析

  • 时间复杂度: O(n),因为每个元素最多入栈一次,出栈一次,遍历数组的过程是线性时间。
  • 空间复杂度: O(n),栈最多存储 n 个元素。

通过优化,我们显著降低了算法的时间复杂度,使得问题的求解更加高效。


知识总结与心得

  1. 滑动窗口与最小值计算: 理解如何通过滑动窗口(遍历子数组)和最小值计算来解决矩形面积问题。对于每个 k 个相邻元素,最小值决定了矩形的高度,宽度为 k
  2. 单调栈的应用: 单调栈是解决类似问题的经典方法,可以避免重复计算并有效提升算法效率。它通过维护一个递增的栈来高效地求解最大矩形面积。
  3. 逐步优化算法: 从暴力解法到优化解法,理解并应用栈等数据结构的技巧,有助于解决时间复杂度较高的问题。

对入门同学的建议

  • 理解核心概念: 在解决这类问题时,理解“滑动窗口”和“最小值计算”是关键。通过反复练习,可以掌握如何通过优化技术降低时间复杂度。
  • 逐步优化: 从简单的暴力解法入手,逐步学习如何用高效的数据结构(如栈)来优化代码。
  • 多做练习: 刷题时,要多总结和反思,通过不断挑战高效算法,提升自己的编程能力。

总结

通过对最大矩形面积问题的练习,我不仅加深了对滑动窗口和栈的理解,还学会了如何通过优化算法提高性能。希望我的学习方法和心得能对其他同学有所帮助,祝大家在编程的道路上不断进步,取得更好的成绩!