LeetCode_Hot100_Demo042接雨水(hard)
2021/7/16 连续打卡的第二天 真不戳
在好多面经中都看到过这道经典的接雨水题,但每每看到这个hard标志,就会望而却步
计得前一段时间的leetcode每日一题有一个相似的题,做过了之后,便将目光伸向了此题

不出所料,刚一开始我便将此题与之前的题搞混在一起

这道Demo11题是将数组从两侧用双指针遍历,最终算得两个下标差乘以之间的距离的最大值
但是明显与此题不符
后来看了题解我才读懂这道接雨水的意思
计算所有空处所能接的雨水的总和值,这样的话,就要计算每个下标处所能承的水量
这里水量用了leftmax和rightmax中的最小值来减去当前位置的height得到
leftmax定义为i处左侧的柱最高值
public class Solution {
public int trap(int[] height) {
int n = height.length;
if (n == 0) return 0;
int[] leftMax = new int[n];
//定义leftmax为i处左侧最大值
leftMax[0] = height[0];
for (int i = 1; i < n; i++) {
leftMax[i] = Math.max(leftMax[i - 1], height[i]);
}
//定义rightmax为i处右侧最大值
int[] rightMax = new int[n];
rightMax[n - 1] = height[n - 1];
for (int i = n - 2; i >= n - 2; i--) {
rightMax[i] = Math.max(rightMax[i + 1], height[i]);
}
/**
* i处可接得的雨水值为leftmax和rightmax的最小值减去i处的height
* 定义ans为可接得的总雨水值,遍历数组,将每个i处可接得的雨水值加和,最后返回
*/
int ans = 0;
for (int i = 0;i < n;i++){
ans += Math.min(leftMax[i], rightMax[i]) - height[i];
}
return ans;
}
}

浙公网安备 33010602011771号