1 题目
2 分析
简述:两个指针分别指向两端,通过判断柱子的升降趋势来判断是否可以接水。
思路如下:
- 变量
l_max,r_max
分别记录当前时刻,左右遍历过的柱子的最高的高度,因为它奠定了水能积多高。 - 分情况判断:
(1)如果指针l,r
指向的柱子,左低右高,且左边的下一个柱子小于l_max
。
那么这个时候左边下一个柱子上的水量就可以计算出来了,就是l_max-height[i+1]
,最后记得i++
(2)如果指针l,r
指向的柱子,左低右高,且左边的下一个柱子大于l_max
。
那么这个时候左边下一个柱子上就没法积水,记得更新l_max=height[i+1];
,最后记得i++
(3)同理,如果指针l,r
指向的柱子,左高右低,且右边的下一个柱子小于r_max
。
那么这个时候右边下一个柱子上的水量就可以计算出来了,就是r_max-height[j-1]
,最后记得j---
(2)如果指针l,r
指向的柱子,左高右低,且右边的下一个柱子大于r_max
。
那么这个时候右边下一个柱子上就没法积水,记得更新r_max=height[j-1];
,最后记得j--
3 AC 代码C++
class Solution {
public:
int trap(vector<int>& height) {
int res=0;
int n=height.size();
int i=0,j=n-1;
int l_max=height[0];//记录左边最高的柱子
int r_max=height[j];//记录右边最高的柱子
while(i<j){
if(height[i]<height[j]){//如果左边比右边低
if(height[i+1]<l_max)//如果接下来的柱子低
res+=l_max-height[++i];//加上height[i+1]上的水
else
l_max=height[++i];//接下来的柱子高,说明没法接水,且更新l_max
}
else if(height[j-1]<r_max)//如果左边柱子高,且右边接下来的柱子矮
res+=r_max-height[--j];//接水!
else
r_max=height[--j];//如果左边柱子高,右边接下来的柱子高,说明没法接水,更新r_max
}
return res;
}
};