这是单指针,双指针见力扣官方题解
class Solution {
public:
int trap(vector<int>& height) {
int rain = 0;
int h = 0;
int left = 0;
int i = 0;
int mid = 0;
int max = 0;
int right = height.size() - 1;
// 确定最高处的最靠右边的位置
for (; i <= right; i++) {
if (height[i] >= max) {
mid = i;
max = height[i];
}
}
// 确定起始左边的位置
while (left < right && !height[left])
left++;
i = left;
h = i + 1;
while (h <= mid && height[i] <= height[h]) {
i++;
h = i + 1;
}
left = height[i];
// 从左边开始
do{
// 确定右边的位置并求接雨水量
h = height[i++];
if (h < left)
rain += (left - h);
else
left = h;
}while(i <= mid);
// 确定起始右边的位置
while (right > mid && !height[right])
right--;
i = right;
h = i - 1;
while (h > mid && height[i] <= height[h]) {
i--;
h = i - 1;
}
right = height[i];
// 从右边开始
do{
// 确定左边的位置并求接雨水量
h = height[i--];
if (h < right)
rain += (right - h);
else
right = h;
}while(i >= mid);
return rain;
}
};