タイトル説明
整数配列arrが与えられた場合、その中のすべての値は負ではないことがわかっています。この配列をコンテナと考えてください。コンテナが保持できる水量を返してください。
例
入る
[3,1,2,5,2,4]
戻り値
5
アイデア
満たすことができる水の量は、左右の下側で決まるため、ダブルポインターを使用して、最初と最後から中央に近づきます。位置iの数が下よりも少ない場合側では、それは水を満たすことができることを意味します。位置iの数が下側よりも大きい場合、下側は位置iの値に更新されます。
public class MaxWaterStruct {
public static void main(String[] args) {
int[] arr = {3,1,2,5,2,4};
MaxWaterStruct maxWaterStruct = new MaxWaterStruct();
long l = maxWaterStruct.maxWater(arr);
System.out.println(l);
}
public long maxWater (int[] arr) {
// write code here
if(arr.length < 1){
return 0;
}
int i = 0; // 左指针
int j = arr.length - 1; // 右指针
int maxLeft = arr[i]; //桶左边的长度
int maxRight = arr[j]; // 桶右边的长度
long ret = 0L; // 盛水总量
while(i < j){
// 较低边为左边
if(maxLeft < maxRight){
i++;
// 当前位置i小于大于较低边,更新较低边的值,小于装水
if(arr[i] > maxLeft){
maxLeft = arr[i];
}else{
ret += maxLeft - arr[i];
}
}else{
// 较低边为右边
j--;
// 当前位置i小于大于较低边,更新较低边的值,小于装水
if(arr[j] > maxRight){
maxRight = arr[j];
}else{
ret += maxRight - arr[j];
}
}
}
return ret;
}
}