算法面试中,高频题目的掌握程度直接决定了你的成败。今天我们就来深度解析左程云在算法课程中反复强调的经典题目——「接雨水」(LeetCode 42题),这道题在字节、腾讯等大厂面试中出现率高达70%!
题目描述:接雨水(Trapping Rain Water)
题目要求:给定 n 个非负整数表示每个柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例:
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:雨水可以接在蓝色区域(示例图中通常用蓝色表示)
难度:★★★★☆(中等偏难) 大厂出现频率:字节跳动(高频)、腾讯(高频)、阿里(中高频)
左程云解法精讲
左程云在算法课程中强调,这道题的核心在于转换视角:不要盯着"水"看,要关注"边界"!
解法1:动态规划(左程云推荐)
核心思路:预处理每个柱子的左右最大边界
public int trap(int[] height) {
int n = height.length;
if (n == 0) return 0;
// 左程云强调:预处理是降低时间复杂度的关键
int[] leftMax = new int[n];
int[] rightMax = new int[n];
// 从左向右扫描,记录每个柱子左侧最高值
leftMax[0] = height[0];
for (int i = 1; i < n; i++) {
leftMax[i] = Math.max(leftMax[i-1], height[i]);
}
// 从右向左扫描,记录每个柱子右侧最高值
rightMax[n-1] = height[n-1];
for (int i = n-2; i >= 0; i--) {
rightMax[i] = Math.max(rightMax[i+1], height[i]);
}
// 计算每个柱子的积水量
int ans = 0;
for (int i = 0; i < n; i++) {
// 左程云技巧:木桶原理,取左右边界最小值
ans += Math.min(leftMax[i], rightMax[i]) - height[i];
}
return ans;
}
时间复杂度:O(n) 空间复杂度:O(n)
解法2:双指针(空间优化版)
左程云在进阶课程中讲解的空间优化技巧:
public int trap(int[] height) {
int left = 0, right = height.length - 1;
int leftMax = 0, rightMax = 0;
int ans = 0;
// 左程云双指针移动法则:谁小移动谁
while (left < right) {
if (height[left] < height[right]) {
if (height[left] >= leftMax) {
leftMax = height[left];
} else {
ans += leftMax - height[left];
}
left++;
} else {
if (height[right] >= rightMax) {
rightMax = height[right];
} else {
ans += rightMax - height[right];
}
right--;
}
}
return ans;
}
时间复杂度:O(n) 空间复杂度:O(1) - 极致优化!
左程云解题方法论
通过这道题,左程云传授的解题心法:
- 问题转化:将"接水"问题转化为"找边界"问题
- 预处理思想:用空间换时间,降低时间复杂度
- 双指针技巧:左右夹击,动态更新边界
- 木桶原理:水位取决于最短的边界
"不要被题目表象迷惑,找到问题的本质特征" —— 左程云
🎁 左老师独家算法资料包 🎁
左程云老师亲自整理的《大厂算法面试通关秘籍》包含:
- 100+高频算法题精解(含接雨水完整剖析)
- 动态规划5大模板与实战应用
- 双指针技巧6种常见题型
- 图论算法精选20题
- 系统设计常见问题及应答策略
私我"666" 即可获取完整资料!
已有3000+学员通过这份资料斩获大厂offer,包含多位年薪百万P7-P8工程师!
大厂面试扩展
左程云课程中针对本题的变种训练:
- 三维接雨水(LeetCode 407题)
- 从二维升级到三维
- 需要使用最小堆(PriorityQueue)
- 盛最多水的容器(LeetCode 11题)
- 相似的双指针应用
- 但计算方式完全不同
- 柱状图中最大矩形(LeetCode 84题)
- 相似的柱状图问题
- 使用单调栈解决
以上题目的完整解答均包含在左老师准备的"666"资料包中!
💡 学习建议:三步提升法 💡
左程云老师建议的学习路径:
- 打基础:掌握基础数据结构(数组/链表/树/图)
- 练思维:精练100道核心高频题(包含在"666"资料包)
- 模拟战:参加每周模拟面试(获取方式见文末)
"算法学习的捷径是有方向、有方法的刻意练习" —— 左程云
总结
「接雨水」问题看似简单,实则蕴含着丰富的算法思想。通过左程云的解题方法论,我们不仅学会了一道题,更掌握了:
- 动态规划的预处理思想
- 双指针的空间优化技巧
- 问题转化的核心思维
立即行动:si我 "666" 获取左老师精心整理的算法资料包,开启你的大厂通关之路!