42. 接雨水
https://leetcode-cn.com/problems/trapping-rain-water/submissions/
经过分析每一个柱子的上面的积水量等于左边最高和右边最高的最低值
所以我们先预处理一遍左边的最高值数组和右边最高值数组
然后一次循环取出来就行
class Solution {
public int trap(int[] height) {
if(height == null || height.length == 0){
return 0;
}
int n = height.length;
int[] leftHeight = new int[n];
int[] rightHeight = new int[n];
leftHeight[0] = height[0];
rightHeight[n - 1] = height[n - 1];
for(int i = 1; i < n; i++){
leftHeight[i] = Math.max(leftHeight[i-1], height[i]);
}
for(int i = n - 2; i>= 0; i--){
rightHeight[i] = Math.max(rightHeight[i+1], height[i]);
}
int res = 0;
for(int i = 0; i<n; i++){
res += Math.min(leftHeight[i], rightHeight[i]) - height[i];
}
return res;
}
}
再经过分析我们发现不论是对于每个值如果当前左边比右边低那么只会取左边的值 那么我们可以用左右指针法 对于每个循环到的指针 比如循环到left指针我们可以确保right指针的值比我们left值都高意味着如果出现rightMax的话肯定比leftMax高 所以我们只需要取leftMax比对就可以。
class Solution {
public int trap(int[] height) {
if(height == null || height.length == 0){
return 0;
}
int n = height.length;
int left = 0;
int right = n - 1;
int leftMax = height[0];
int rightMax = height[n-1];
int res = 0;
while(left < right){
if(height[left] < height[right]){
//如果左边比右边矮的话更新则以左边的更新
if(height[left] > leftMax){
leftMax = height[left];
}else{
res += leftMax - height[left];
}
left++;
}else{
if(height[right] > rightMax){
rightMax = height[right];
}else{
res += rightMax - height[right];
}
right--;
}
}
return res;
}
}