两指针问题。需要生成左右两个指针,不断靠近,直到碰到一起。
- 需要有lheight,rheight分别记录:从左遍历到当前左指针位置的最大值和从右遍历到当前右指针位置的最大值,因为这个最大值减当前值,是能蓄水的高度。
- 左、右指针的位置,谁先动,是由谁的最大值更低决定的,谁低谁动(相当于水位高度有另一个指针位置能挡住,便可以不断累加当前指针蓄水量到结果)
class Solution {
public:
/**
* @param heights: a list of integers
* @return: a integer
*/
int trapRainWater(vector<int> &heights) {
if (heights.empty()) {
return 0;
}
int result = 0;
int left = 0;
int right = heights.size() - 1;
int lheight = heights[left];
int rheight = heights[right];
while (left + 1 < right) {
if (lheight < rheight) {
left++;
lheight = max(lheight, heights[left]);
result += lheight - heights[left];
} else {
right--;
rheight = max(rheight, heights[right]);
result += rheight - heights[right];
}
}
return result;
}
};