一个 9 * 9 的数独的棋盘。判断已经写入数字的棋盘是不是合法。需要满足下边三点,
- 每一行的数字不能重复
- 每一列的数字不能重复
- 9 个 3 * 3 的小棋盘中的数字也不能重复。
只能是 1 - 9 中的数字,不需要考虑数独最后能不能填满。
解法一 暴力解法
需要满足三条,那就一条一条判断。
publicbooleanisValidSudoku(char[][] board) { //判断每一行for (inti=0; i<9; i++) { if (!isValidRows(board[i])) { returnfalse; } } //判断每一列for (inti=0; i<9; i++) { if (!isValidCols(i, board)) { returnfalse; } } //判断每个小棋盘for (inti=0; i<9; i=i+3) { for (intj=0; j<9; j=j+3) { if (!isValidSmall(i, j, board)) { returnfalse; } } } returntrue; } publicbooleanisValidRows(char[] board) { HashMap<Character, Integer>hashMap=newHashMap<>(); for (charc : board) { if (c!='.') { if (hashMap.getOrDefault(c, 0) !=0) { returnfalse; } else { hashMap.put(c, 1); } } } returntrue; } publicbooleanisValidCols(intcol, char[][] board) { HashMap<Character, Integer>hashMap=newHashMap<>(); for (inti=0; i<9; i++) { charc=board[i][col]; if (c!='.') { if (hashMap.getOrDefault(c, 0) !=0) { returnfalse; } else { hashMap.put(c, 1); } } } returntrue; } publicbooleanisValidSmall(introw, intcol, char[][] board) { HashMap<Character, Integer>hashMap=newHashMap<>(); for (inti=0; i<3; i++) { for (intj=0; j<3; j++) { charc=board[row+i][col+j]; if (c!='.') { if (hashMap.getOrDefault(c, 0) !=0) { returnfalse; } else { hashMap.put(c, 1); } } } } returntrue; }
时间复杂度:整个棋盘访问了三次,如果棋盘大小是 n,那么就是 3n。也就是 O(n)。
空间复杂度:O(1)。
总
第一种解法的作者太太聪明了!自己规定格式这种思想,很棒。