模拟

方法1

public boolean isValidSudoku(char[][] board) {
    int R = board.length, C = board[0].length;
    int[] rows = new int[R + 1], cols = new int[C + 1], blocks = new int[10];
    for (int r = 0; r < R; r++) {
        for (int c = 0; c < C; c++) {
            char cur = board[r][c];
            if (cur == '.') continue;
            int t = cur - '0';
            int idx = r / 3 * 3 + c / 3;
            if (((rows[r] >> t) & 1) == 1 || ((cols[c] >> t) & 1) == 1 || ((blocks[idx] >> t) & 1) == 1)
                return false;
            rows[r] |= (1 << t);
            cols[c] |= (1 << t);
            blocks[idx] |= (1 << t);
        }
    }

    return true;
}

另外一种写法

方法2

方法1:模拟+库函数

  • 每次模拟一次翻转,判断是否相同

方法2:翻转点

  • 按翻转点的下标索引计算

方法3:一行

方法1

方法2

方法3

方法4

Last updated