如何解决LeetCode第42题(接雨水)的C++实现?
时间: 2024-09-09 18:01:42 浏览: 45
c++-c++编程基础之leetcode题解第42题接雨水.zip
LeetCode第42题"接雨水"是一个经典的算法问题,要求根据给定的整数数组表示的直方图,计算可以接的雨水总量。解决这个问题通常有几种方法,其中一种是使用双指针法。
以下是使用双指针法的C++实现方式:
1. 初始化两个指针left和right分别指向数组的开始和结束,同时初始化两个变量left_max和right_max分别记录遍历过程中遇到的最大高度。
2. 使用一个变量sum来记录接的雨水总量。
3. 在left < right的条件下,通过比较left_max和right_max的值来决定移动哪个指针:
- 如果left_max < right_max,说明当前位置接的雨水量取决于left_max,计算当前left处可以接的雨水量(left_max - 当前直方图高度),然后将left指针向右移动,并更新left_max。
- 否则,执行类似的操作,只是这次关注right指针和right_max。
4. 当left >= right时,遍历结束,此时sum即为总共可以接的雨水量。
下面是具体的C++代码实现:
```cpp
int trap(vector<int>& height) {
int left = 0, right = height.size() - 1;
int left_max = 0, right_max = 0;
int sum = 0;
while (left < right) {
if (height[left] < height[right]) {
if (height[left] >= left_max) {
left_max = height[left];
} else {
sum += left_max - height[left];
}
++left;
} else {
if (height[right] >= right_max) {
right_max = height[right];
} else {
sum += right_max - height[right];
}
--right;
}
}
return sum;
}
```
阅读全文