LeetCode42.接雨水
题目描述
/**
*
* 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,
* <p>
* 计算按此排列的柱子,下雨之后能接多少雨水。
*
*/
思路分析
- 使用 双指针 + 双变量 的方法
- 双指针分别指向数组左右两侧的索引,双变量分别保存数组左右两侧的最大值
- 依次比较两侧最大值,将较小测指针移动,保证每次移动的都是小的一侧
- 然后记录当前指针位置所能存储的水量并记录
- 详解见下
源码及分析
public int trap(int[] height) {
//数据校验
if (height == null || height.length < 2) {
return 0;
}
//定义 left 和 right 指向数组最左边和最右边索引,然后依次移动左右指针,
//定义leftMax 和 rightMax 指向左右水柱的最高值
int totalWater = 0, left = 0, right = height.length - 1, leftMax = 0, rightMax = 0;
//当两指针重合的时候结束循环
while (left < right){
//leftMax指向左侧的最高水柱
leftMax = Math.max(leftMax,height[left]);
//rightMax指向右侧的最高水柱
rightMax = Math.max(rightMax,height[right]);
//如果当前左侧水柱低于右侧水柱,则当前位置所能存储的水为leftMax - height[left]
//记录后移动指针
if (leftMax <= rightMax){
totalWater += (leftMax - height[left]);
left ++;
}else {
totalWater += (rightMax - height[right]);
right--;
}
}
return totalWater;
}