刷题篇:最大矩形问题 | 豆包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个相邻元素中的最小值乘以 k*。现在,小S希望你能帮他找出对于任意 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)的最大值

解题思路

  1. 首先要获取 k个相邻元素中的最小值,在min()函数中,用for循环遍历查找从索引 i 开始长度为 k 的子数组中的最小值,然后返回查找到的最小值min_element
  2. 然后用嵌套for循环从头开始遍历并计算每个k值时的R(k),然后与max_area对比,大于max_area就更新max_area的值,最后返回R(k)的最大值

解题代码

def min(i, k, array):
    min_element = array[i]

    for j in range(i, i + k):
        if array[j] < min_element:
            min_element = array[j]

    return min_element

def solution(n, array):
    # Edit your code here
    max_area = 0

    for i in range(n):
        for k in range(n-i+1):
            min_element = min(i ,k ,array)
            area = k * min_element
            if area > max_area:
                max_area = area

    return max_area

if __name__ == "__main__":
    # Add your test cases here
    print(solution(9, [15,5,22,19,5,20,13,12,12]) == 48)
    print(solution(5, [1, 2, 3, 4, 5]) == 9)

总结与思考

遇到的问题

  1. 刚开始的时候,我先遍历k再遍历i,就导致了数组越界的情况;后来我就改为先遍历i再遍历k,就不会出现数组越界的情况了
  2. 然后是对于遍历范围的设置的不正确导致结果错误,一开始k是从i到n-i+1里取值的,后面发现少计算了一些情况,然后重新看题后删除了从i 开始取值,改为从0开始,这样就能覆盖所有情况

收获与感悟

在写这道题的时候,我对于for循环的使用有了更深刻的了解,另外我是使用暴力搜索的方法解决了这个问题,但是这样的时间复杂度高,但性能不好,有待改进。另外,我在最小值计算的时候把这封装成一个独立的函数,提高了代码的可读性和复用性。当前实现的时间复杂度为O(n^3),对于较大的输入规模,性能可能会成为瓶颈。因此,我要去学习其它算法,提高算法性能。