頻繁なテストデータの構造とアルゴリズム:コンテナの水問題

タイトル説明

整数配列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;
    }
}

 

おすすめ

転載: blog.csdn.net/m0_37564426/article/details/114087656