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

47 阅读3分钟

今天做了一道中等难度的题目:“最大矩形面积问题”,在思考和写代码的过程中,我意识到了我代码存在的一些问题,最后虽然能成功解答,但是也有很多可以改进的地方,总的来说这次解题我收获了很多。

我的解题过程与思路说明

在这个问题中,我们需要从一个高度数组中找出任意 k 个相邻元素所能形成的最大矩形面积。根据问题的定义,对于任意 k,矩形的最大面积可以表示为 R(k)=k×min⁡(h[i],h[i+1],…,h[i+k−1])。这意味着我们的任务是计算出所有可能的 k 值对应的最大面积,然后找出其中的最大值。

在考虑解决方法时,我意识到这实际上涉及到多个子任务:首先我们需要找到每个可能的 k 及其对应的最小值,然后计算相应的面积。为了做到这一点,我们可以采用双重循环,外层循环遍历 k 的值,内层循环则用于遍历数组中的每个子集以计算最小值。

我的具体思路如下:

  1. 外层循环遍历 k 的值,从 1 到 n。
  2. 内层循环遍历每个子数组,计算当前子数组的最小值,并用这个最小值乘以 k 得到该子数组的矩形面积。
  3. 更新当前找到的最大面积值。
  4. 最终返回找到的最大面积。

在代码实现中,我首先定义了一个自定义的 min() 函数来计算子数组的最小值。然后在 solution() 函数中,分别使用两个循环遍历所有的 k 和子数组,计算及更新最大面积。这种方法虽然直观,但在效率上可能不是最优的。

我的Python代码

def min(p: list):
    n = 0
    i = 0
    j = 0
    while p[n:]:
        n += 1
    while j < n - 1:
        while i < n - 1:
            if p[i] > p[i + 1]:
                p[i], p[i + 1] = p[i + 1], p[i]
            i += 1
        j += 1
        i = 0
    return p[0]

def solution(n, array):
    x = 0
    i = 1
    j = 0
    while i <= n:
        while j < n - i + 1:
            p = array[j: j + i]
            if x < min(p) * i:
                x = min(p) * i
            j += 1
        j = 0
        i += 1
    return x

收获与反思

通过这个题目的解决过程,我收获了很多关于如何处理数组和使用循环嵌套来解决问题的经验。尽管我的初步实现能够得到正确的结果,但在性能方面表现较差,尤其是在数组长度增大时。在实现过程中,我也更加深入理解了 “最小值” 和 “数组切片” 的概念。然而,时间复杂度过高的问题让我意识到如何优化算法是我需要持续学习的方向。

此外,我还学到了如何将问题的逻辑结构转化为代码。在开始编写代码之前,先在脑中理解问题的解法并将其分解为小任务,这种方法极大地提高了我解决问题的效率。

这个问题的解决过程让我领悟到了数组处理与循环嵌套基于数学逻辑的代码实现的重要性,同时也让我意识到效率优化的必要。这些体验将促使我继续探索更好的算法和数据结构,并在未来的学习中不断改进我的编程技巧。