思路:双指针
接水的多少取决于短板。因此指针left与right一左一右,每次取出最小值,从left往后寻找比最小值小的挡板,二者之差为当前挡板的接水量,直到遇到比它高的。同理,right也往中间寻找,直到遇到比它高的挡板。此时一轮大循环结束,重新计算left与right之间的最小值,开始新一轮的大循环。
public long maxWater (int[] arr) {
// write code here
int left=0;
int right=arr.length-1;
long water=0;
while(left<right){
//计算left与right挡板的较小值。
int min=arr[left]<arr[right]?arr[left]:arr[right];
while(left<right && arr[left]<=min){
water+=min-arr[left];
left++;
}
while(left<right && arr[right]<=min){
water+=min-arr[right];
right--;
}
}
return water;
}
京公网安备 11010502036488号