42. 接雨水
解題思路:使用首尾指針。比較數組兩側的值,以數值較小的一側的高度作為當前位置(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; }

浙公網安備 33010602011771號