1. 算法训练营中的经典难题解析
作为一名经历过多次算法面试的老兵,我深知"接雨水"和"柱状图中最大的矩形"这两道题在技术面试中的分量。这两道LeetCode hard级别的题目,不仅考察对数据结构的理解,更是对问题建模能力和思维缜密度的绝佳测试。今天我就带大家深入剖析这两道经典题目,分享我在代码随想录算法训练营中总结的解题心法。
记得第一次遇到"接雨水"问题时,我花了整整三小时才勉强通过所有测试用例。而"柱状图中最大的矩形"更是在面试中让我栽过跟头。经过系统性的训练和反复实践,我发现这两道题虽然表面差异很大,但核心都离不开对单调栈这一数据结构的灵活运用。下面我们就从最基础的暴力解法开始,逐步优化到最优解。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 42. 接雨水问题深度剖析
2.1 问题描述与直观理解
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。这是LeetCode上经典的"接雨水"问题描述。
想象一下城市的天际线,高矮不一的建筑物排列在一起。下雨时,雨水会在建筑物之间的凹陷处积聚。我们的任务就是计算这些"凹陷"能存储多少雨水。关键在于理解:对于每个位置i,它能存储的水量取决于它左边最高和右边最高柱子中的较小值。
提示:很多初学者会误以为只需要看相邻柱子的高度差,实际上必须考虑全局的左右边界。
2.2 暴力解法及其局限性
最直观的解法是对于每个位置i:
- 向左扫描找到最大高度left_max
- 向右扫描找到最大高度right_max
- 当前位置i的储水量为min(left_max, right_max) - height[i]
python复制def trap_brute_force(height):
total = 0
n = len(height)
for i in range(1, n-1):
left_max = max(height[:i])
right_max = max(height[i+1:])
water = min(left_max, right_max) - height[i]
if water > 0:
total += water
re
