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;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。