问题描述
小S最近在分析一个数组 h1,h2,...,hN,数组的每个元素代表某种高度。小S对这些高度感兴趣的是,当我们选取任意k个相邻元素时,如何计算它们所能形成的最大矩形面积。
对于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)R(k) 的值为这k个相邻元素中的最小值乘以k。现在,小S希望你能帮他找出对于任意k,R(k)R(k) 的最大值。
测试样例
样例1:
输入:
n = 5, array = [1, 2, 3, 4, 5]
输出:9
样例2:
输入:
n = 6, array = [5, 4, 3, 2, 1, 6]
输出:9
样例3:
输入:
n = 4, array = [4, 4, 4, 4]
输出:16
问题理解
你需要计算一个数组中任意 k 个相邻元素所能形成的最大矩形面积。矩形的面积定义为这 k 个元素中的最小值乘以 k。
思路分析
-
使用滑动窗口技术,遍历数组中所有可能的
k个相邻元素。(k的长度<=数组长度) -
计算每个窗口的最小值,并乘以
k得到当前窗口的面积。 -
用当前面积与最大面积相比较,更新最大面积
Python代码展示
def solution(n, array):
max_area = 0
for k in range(1,n+1):
for i in range(n-k+1):
min_heiget = min(array[i:i+k])
area=k*min_heiget
max_area=max(max_area,area)
return max_area
重点代码块
for k in range(1,n+1):
for i in range(n-k+1):
min_heiget = min(array[i:i+k])
- for k in range(1, n + 1):
外层循环,用于遍历不同长度的子数组,k表示子数组的长度,从1开始到n。
- for i in range(n - k + 1):
内层循环,用于在原数组中滑动选取长度为k的子数组i表示子数组起始位置的索引,范围是从0到n - k,保证能取到长度为k的子数组。
- min_heiget = min(array[i:i + k])
取出当前长度为k的子数组,并找到其中的最小高度值,因为以这个子数组构建矩形时,高度受限于最小高度值。
示例
输入:
n = 5, array = [1, 2, 3, 4, 5]
输出:9
逐步计算
-
k = 1:
- 所有可能的子数组:
[1],[2],[3],[4],[5] - 最小值:
1,2,3,4,5 - 面积:
1 * 1 = 1,2 * 1 = 2,3 * 1 = 3,4 * 1 = 4,5 * 1 = 5 - 最大面积:
5
- 所有可能的子数组:
-
k = 2:
- 所有可能的子数组:
[1, 2],[2, 3],[3, 4],[4, 5] - 最小值:
1,2,3,4 - 面积:
2 * 1 = 2,2 * 2 = 4,2 * 3 = 6,2 * 4 = 8 -
-
- 最大面积:
8
- 最大面积:
-
- 所有可能的子数组:
-
k = 3:
- 所有可能的子数组:
[1, 2, 3],[2, 3, 4],[3, 4, 5] - 最小值:
1,2,3 - 面积:
3 * 1 = 3,3 * 2 = 6,3 * 3 = 9 - 最大面积:
9
- 所有可能的子数组:
-
k = 4:
- 所有可能的子数组:
[1, 2, 3, 4],[2, 3, 4, 5] - 最小值:
1,2 - 面积:
4 * 1 = 4,4 * 2 = 8 - 最大面积:
8
- 所有可能的子数组:
-
k = 5:
- 所有可能的子数组:
[1, 2, 3, 4, 5] - 最小值:
1 - 面积:
5 * 1 = 5 - 最大面积:
5
- 所有可能的子数组:
最终结果
通过上述计算,我们可以看到当 k = 3 时,子数组 [3, 4, 5] 的最小值为 3,面积为 3 * 3 = 9,这是所有可能的 k 值中最大的面积。
因此,输入 n = 5, array = [1, 2, 3, 4, 5] 时,输出结果为 9。