手撕算法-接雨水
- 开源代码
- 2025-07-22 14:06:01

描述
分析
i位置能积累的雨水量,等于其左右两边最大高度的最小值。为了能获取i位置左右两边的最大高度。使用动态规划。两个dp数组:
leftMaxrightMax其中
leftMax[i] 代表i位置左边的最大高度rightMax[i] 代表i位置右边的最大高度初始状态:
leftMax[0] = 0;rightMax[0] =0;填充这两个dp数组。
那么i位置最终能存的雨水量为:min(eftMax[i] , rightMax[i]) - height[i]
遍历所有位置,即可得到总共能接的雨水数。
代码 class Solution { public int trap(int[] height) { int n = height.length; 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 res = 0; for (int i = 0; i < n; i++) { res += Math.min(leftMax[i], rightMax[i]) - height[i]; } return res; } }
面试公司