1 题目描述
2 解题思路
- 方法:双指针
我们先明确几个变量的意思:
left_max:左边的最大值,它是从左往右遍历找到的
right_max:右边的最大值,它是从右往左遍历找到的
left:从左往右处理的当前下标
right:从右往左处理的当前下标
自己的理解:
-
第一层while循环体
当left< right,符合条件的时候进入循环体 -
第二层 if 条件判断
像下图所示,如果左侧高度<右侧高度,积水量由左侧决定,
这时候右边较大,那么右边就作为右边界,记录左侧的积水量,可以进入进入水量的循环体
左边大的时候同理可得!
- 第三层 if 嵌套操作
当左边的值小于右边的值的时候,那么
对于左边来说,
如果现在所处位置的值> left_max,那么更新left_max,
否则,如果小于,那么就形成凹陷,可以接到雨水,将差值加到res结果集中
对于右边来说也是同理
3 解决代码
- 方法:双指针《Java代码》
class Solution {
public int trap(int[] height) {
int left = 0;
int right = height.length - 1;
int left_max = 0;
int right_max = 0;
int res = 0;
while(left < right){
//如果左侧高度<右侧高度,积水量由左侧决定,
//这时候右边较大,那么右边就作为右边界,记录左侧的积水量,可以进入进入水量的循环体
if(height[left] < height[right]){
if(height[left] >= left_max){
left_max = height[left];
}
else{
res += left_max- height[left] ;
}
left++;
}
else{
if(height[right] >= right_max){
right_max = height[right];
}
else{
res += right_max - height[right];
}
right--;
}
}
return res;
}
}
- 方法:双指针《python3代码》
class Solution:
def trap(self, height: List[int]) -> int:
left = 0
right = len(height) - 1
left_max = right_max = 0
res = 0
while left < right:
if height[left] < height[right]:
if height[left] >= left_max:
left_max = height[left]
else:
res += left_max - height[left]
left += 1
else:
if height[right] >= right_max:
right_max = height[right]
else:
res += right_max - height[right]
right -= 1
return res