最大面积矩形问题 | 豆包MarsCode AI刷题
题目解析:最大面积矩形问题
问题描述: 小S最近在分析一个数组 (h_1, h_2, ..., h_N),数组的每个元素代表某种高度。小S对这些高度感兴趣的是,当我们选取任意 (k) 个相邻元素时,如何计算它们所能形成的最大矩形面积。
对于 (k) 个相邻的元素,我们定义其矩形的最大面积为: [R(k) = k \times \min(h[i], h[i+1], ..., h[i+k-1])] 即,(R(k)) 的值为此 (k) 个相邻元素中的最小值乘以 (k)。现在,小S希望你能帮他找出对于任意 (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
代码详解 (Python):
from typing import List
def solution(n: int, array: List[int]) -> int:
# Precompute the nearest smaller element to the left and right
left = [-1] * n
right = [n] * n
# Monotonic stack for finding left bounds
stack = []
for i in range(n):
while stack and array[stack[-1]] >= array[i]:
stack.pop()
if stack:
left[i] = stack[-1]
stack.append(i)
# Clear the stack for the right bounds
stack.clear()
for i in range(n-1, -1, -1):
while stack and array[stack[-1]] >= array[i]:
stack.pop()
if stack:
right[i] = stack[-1]
stack.append(i)
# Calculate the maximum area
max_area = 0
for i in range(n):
width = right[i] - left[i] - 1
max_area = max(max_area, width * array[i])
return max_area
if __name__ == "__main__":
print(solution(5, [1, 2, 3, 4, 5])) # Output: 9
print(solution(6, [5, 4, 3, 2, 1, 6])) # Output: 9
print(solution(4, [4, 4, 4, 4])) # Output: 16
知识总结
在使用豆包MarsCode AI刷题的过程中,我学到了以下几个新知识点:
- 单调栈的应用:通过维护一个单调递增的栈,可以有效地找到每个元素左侧第一个比它小的元素的位置。
- 双指针技巧:通过两个指针分别从左到右和从右到左遍历数组,可以快速确定每个元素右侧第一个比它小的元素的位置。
- 动态规划思想:虽然本题没有直接使用动态规划,但在寻找最优解的过程中,我们需要考虑所有可能的选择,并从中选出最佳方案,这种思维方式与动态规划类似。
学习建议:
- 对于初学者,建议先从基础的算法和数据结构入手,熟练掌握常见的排序、查找、递归等算法。
- 在刷题过程中,不仅要关注代码的正确性,还要注意代码的效率和简洁性。
- 定期回顾和总结,将相似的问题放在一起比较,有助于深入理解相关知识点。
学习计划
- 每日刷题:每天至少刷一道新的算法题,可以选择豆包MarsCode AI平台上的题目。
- 分类归纳:将刷过的题目按照主题分类,便于后期复习和总结。
- 错题重做:对于做错的题目,一定要重新做一遍,直到完全理解为止。
- 限时训练:为了适应竞赛环境,可以设置时间限制,锻炼快速解决问题的能力。
工具运用
- 利用AI辅助:豆包MarsCode AI平台提供了丰富的题目和详细的解答,可以根据自己的进度选择合适的题目进行练习。
- 结合视频课程:观看一些高质量的算法讲解视频,可以帮助更快地理解和吸收知识点。
- 参与线上讨论:加入相关的编程社群,与其他学习者一起讨论问题,互相学习和启发。
希望以上的内容能为你提供一些有用的参考和启示,祝你在算法学习的路上越走越远!