接雨水
抽象模型:两侧木板可以调节高度的木桶 能存多少水,取决于两侧木板的高度。碰撞指针,维护maxL和maxR表示两侧木板高度。 以指针l来说,当前它的位置左侧的maxL是可信的,它右侧的maxR未必是最大(想象输入样例的情况,两侧木板中间***一根更长的木板,把一个木桶分成了两个木桶)。但是这并不影响当前位置的储水量。 假设maxL < maxR,那么不管maxR是否准确,当前位置能存储的水量都是maxL - arr[l]. 若maxL > maxR,同理,右侧部分是可信的。
class Solution {
public:
/**
* max water
* @param arr int整型vector the array
* @return long长整型
*/
long long maxWater(vector<int>& arr) {
// write code here
int n = arr.size();
if(n == 0)
return 0;
long res = 0;
int l = 0;
int r = n - 1;
int maxL = 0;
int maxR = 0;
while( l < r ){
//碰撞指针每次移动,都要维护两侧木板高度
maxL = max(maxL,arr[l]);
maxR = max(maxR,arr[r]);
//判断左右木板谁可信
if(maxL < maxR)
res += maxL - arr[l++];
else
res += maxR - arr[r--];
}
return res;
}
};

京公网安备 11010502036488号