题解 | #接雨水问题#(边界最低高度决定容器上限,由两边向中间查找)
接雨水问题
http://www.nowcoder.com/practice/31c1aed01b394f0b8b7734de0324e00f
/* 申明两个边界指针,容量由高度差决定,且边界的低高度决定容器大致容量,由两边向中间扫描,且低高度边界指针优先。 边界指针肯定越高越好,内部高度越低越好。 每次从左右边界最大值较小的一方开始向中间移动。左右指针只有按最小值移动,每次确定累加容量。 拥有较小的边界最值指针移动,如果移动后的高度下于边界值最大值,则容量累加。 重复过程,直到左右指针相遇。 */ class Solution { public: long long maxWater(vector<int>& arr) { long long ans = 0; int l_max = 0, r_max = 0; int l = 0, r = arr.size()-1; while(l <= r){ l_max = max(l_max, arr[l]); // 左边最高点 r_max = max(r_max, arr[r]); // 右边最高点 if(l_max < r_max){ // 每次移动边界最值较小的指针。 ans += l_max - arr[l++]; }else{ ans += r_max - arr[r--]; } } return ans; } };