解题思路:使用首尾指针。比较数组两侧的值,以数值较小的一侧的高度作为当前位置(L或R)两侧的堤坝,从而计算出当前位置的雨水量(因为雨水量的瓶颈是较低一侧的高度),并且更新首尾指针路过数字的最大值。然后历史最大值较小的一侧的指针向数组中心移动,直到首尾指针相遇。
C++:
int Water4(const vector<int>& array) { size_t arr_len = array.size(); if (arr_len <= 2) return 0; int L = 1; int R = arr_len - 2; int left_max = array[0]; int right_max = array[arr_len - 1]; int water = 0; while (L <= R) { if (left_max <= right_max) { water += max(left_max - array[L], 0); left_max = max(left_max, array[L++]); } else { water += max(right_max - array[R], 0); right_max = max(right_max, array[R--]); } } return water; }