0

LeetCode の質問を解決しています: すべてのボールを各ボックスに移動するための操作の最小数。

n箱があります。長さ のバイナリ文字列ボックスが与えられますn。ここでboxes[i]、th ボックスが空の場合は '0'、iボールが 1 つ含まれている場合は '1' です。1 回の操作で、ボックスから隣接するボックスに 1 つのボールを移動できます。size の配列回答を返しますn。ここで、はすべてのボールをth ボックスanswer[i]に移動するために必要な操作の最小数です。i入力boxes = "001011"の場合、出力は次のとおり[11,8,5,4,3,4]です。

それを行うことO(n^2)は簡単です。その方法でしか解決できませんでした。私はこの O(n)解決策を理解しようとしていますが、苦労しています:

class Solution {
    public int[] minOperations(String boxes) {
        int n = boxes.length();

        int[] left = new int[n];
        int[] right = new int[n];
        int[] ans = new int[n];

        int count = boxes.charAt(0) - '0';
        for(int i = 1 ; i < n ; i++){
            left[i] = left[i - 1] + count;
            count += boxes.charAt(i) - '0';
            // System.out.println("i: "+i+" left[i]: "+left[i]+" left[i-1] : "+left[i-1]+" count: " + count);
        }

        count = boxes.charAt(n - 1) - '0';
        for(int i = n - 2 ; i >=0 ; i--){
            right[i] = right[i + 1] + count;
            count += boxes.charAt(i) - '0';
            // System.out.println("i: "+i+" right[i]: "+right[i]+" right[i+1] : "+right[i+1]+" count: " + count);
        }
        
        for(int i = 0 ; i < n ; i++) {
            ans[i] = left[i] + right[i];
        }

        return ans;
    }
}

誰かが背後にあるロジックを詳しく説明してください:

left[i] = left[i - 1] + count;
count += boxes.charAt(i) - '0';

ボールに遭遇するたびにインクリメントすることは理解していますが、左側のすべてのボールを に移動するためにこれまでに必要な操作の数をカウントするcountのにどのように役立ちますか(の場合はその逆)?left[i] = left[i - 1] + count;iright

ありがとうございました!

4

2 に答える 2