圧縮後数世紀



アルゴリズムの資料は私も自分で解答したことがありますが、他の人との解答の比較を通じて、私が整理したこれらの資料はもっと良いアルゴリズムを学ぶためです.

プログラマー-四圧縮後の数世紀


https://programmers.co.kr/learn/courses/30/lessons/68936
解答:x、yを基準に領域を4等分し、その領域のすべての数字が等しいかどうかをチェックします.(divideメソッド)
数は1でo(1)、数は0でz(0)++を表す.
class Solution {
    static int z, o;
    static int [][] array;
    public int[] solution(int[][] arr) {
        array = arr;
        divide(0, arr.length, 0, arr.length);
        return new int [] {z, o};
    }
    private static void divide(int a, int b, int c, int d) {
        int cnt = 0;
        for (int i = a; i < b; i++) {
            for (int j = c; j < d; j++) {
                if(array[j][i] == 1) cnt++;
            }
        }
        if((b - a) * (d - c) == cnt) o++;
        else if(cnt == 0) z++;
        else {
            int b2 = (a + b) / 2;
            int d2 = (c + d) / 2;
            divide(a, b2, c, d2);
            divide(a, b2, d2, d);
            divide(b2, b, c, d2);
            divide(b2, b, d2, d);
        }
    }
}