问题描述
小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)的最大值
解题思路
- 首先要获取 k个相邻元素中的最小值,在min()函数中,用for循环遍历查找从索引 i 开始长度为 k 的子数组中的最小值,然后返回查找到的最小值min_element
- 然后用嵌套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)
总结与思考
遇到的问题
- 刚开始的时候,我先遍历k再遍历i,就导致了数组越界的情况;后来我就改为先遍历i再遍历k,就不会出现数组越界的情况了
- 然后是对于遍历范围的设置的不正确导致结果错误,一开始k是从i到n-i+1里取值的,后面发现少计算了一些情况,然后重新看题后删除了从i 开始取值,改为从0开始,这样就能覆盖所有情况
收获与感悟
在写这道题的时候,我对于for循环的使用有了更深刻的了解,另外我是使用暴力搜索的方法解决了这个问题,但是这样的时间复杂度高,但性能不好,有待改进。另外,我在最小值计算的时候把这封装成一个独立的函数,提高了代码的可读性和复用性。当前实现的时间复杂度为O(n^3),对于较大的输入规模,性能可能会成为瓶颈。因此,我要去学习其它算法,提高算法性能。