Leetcode[36] Valid Sudoku

Determine if a Sudoku is valid, according to: Sudoku Puzzles - The
Rules.

The Sudoku board could be partially filled, where empty cells are
filled with the character '.'.

图片描述

Note: A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.

坐标转换

复杂度
时间复杂度 O(MN) 空间复杂度 O(1)

思路
对于boardi上的一点,要满足这一点所在的行,所在的列,和这一点所在的block里有且只有这一个数。首先考虑,如何找到这一点对应的block。block的index可以由(i / 3) 3 + j / 3确定,这一点在block里面的位置可以由(i % 3) 3 + j % 3确定. 所以每确定一行,每一个值都可以被转换到一个block之中。

如果允许O(N)的空间复杂度,可以设置一个二维数组9*9来用来判断是否在block里重现了重复的数字。如果用O(1)的空间复杂度,可以用bitset的方式。将一个数字的每一个bit位上表示每一个数字。通过将set和新来的数字相与,可以知道这个数字是否之前出过。

代码

// 关键是如何将坐标转换成在每一个小的九宫格;
public boolean isValidSudoku(char[][] board) {
    for(int i = 0; i < 9; i ++) {
        // set bitmap for row, col and block.
        int row = 0;
        int col = 0;
        int block = 0;
        for(int j = 0; j < 9; j ++) {
            int rowval = board[i][j] - '1';
            int colval = board[j][i] - '1';
            int blockval = board[i / 3 * 3 + j / 3][i % 3 * 3 + j % 3] - '1';
            // 将值移动每一个bit位上,来判断是否相等。
            if(rowval >= 0 && (row & (1 << rowval)) != 0
            || colval >= 0 && (col & (1 << colval)) != 0
            || blockval >= 0 && (block & (1 << blockval)) != 0) return false;
            row |= 1 << rowval;
            col |= 1 << colval;
            block |= 1 << blockval;
        }
    }
    return true;
}

hellolittleJ17
10 声望11 粉丝