题目:有效的数独 请你判断一个 9x9
的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。
数字 1-9
在每一行只能出现一次。 数字 1-9
在每一列只能出现一次。 数字 1-9
在每一个以粗实线分隔的 3x3
宫内只能出现一次。(请参考示例图) 数独部分空格内已填入了数字,空白格用 '.'
表示。
难度:中等
注意:
一个有效的数独(部分已被填充)不一定是可解的。
只需要根据以上规则,验证已经填入的数字是否有效即可。
示例 1:
输入:board = [[“5”,”3”,”.”,”.”,”7”,”.”,”.”,”.”,”.”] ,[“6”,”.”,”.”,”1”,”9”,”5”,”.”,”.”,”.”] ,[“.”,”9”,”8”,”.”,”.”,”.”,”.”,”6”,”.”] ,[“8”,”.”,”.”,”.”,”6”,”.”,”.”,”.”,”3”] ,[“4”,”.”,”.”,”8”,”.”,”3”,”.”,”.”,”1”] ,[“7”,”.”,”.”,”.”,”2”,”.”,”.”,”.”,”6”] ,[“.”,”6”,”.”,”.”,”.”,”.”,”2”,”8”,”.”] ,[“.”,”.”,”.”,”4”,”1”,”9”,”.”,”.”,”5”] ,[“.”,”.”,”.”,”.”,”8”,”.”,”.”,”7”,”9”]] 输出: true
示例 2:
输入:board = [[“8”,”3”,”.”,”.”,”7”,”.”,”.”,”.”,”.”] ,[“6”,”.”,”.”,”1”,”9”,”5”,”.”,”.”,”.”] ,[“.”,”9”,”8”,”.”,”.”,”.”,”.”,”6”,”.”] ,[“8”,”.”,”.”,”.”,”6”,”.”,”.”,”.”,”3”] ,[“4”,”.”,”.”,”8”,”.”,”3”,”.”,”.”,”1”] ,[“7”,”.”,”.”,”.”,”2”,”.”,”.”,”.”,”6”] ,[“.”,”6”,”.”,”.”,”.”,”.”,”2”,”8”,”.”] ,[“.”,”.”,”.”,”4”,”1”,”9”,”.”,”.”,”5”] ,[“.”,”.”,”.”,”.”,”8”,”.”,”.”,”7”,”9”]] 输出:false 解释:除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。 但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/valid-sudoku 著作权归领扣网络所有。商业转载请联系官方获得授权,非商业转载请注明出处。
解题思路
迭代
解题代码 迭代 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 class Solution { public boolean isValidSudoku (char [][] board) { int [][] rows = new int [board.length][board.length]; int [][] cols = new int [board.length][board.length]; int [][] box = new int [board.length][board.length]; for (int i = 0 ; i < board.length; i++){ for (int j = 0 ; j < board[0 ].length; j++){ if (board[i][j] != '.' ){ int num = board[i][j] - '1' ; int index_box = (i / 3 ) * 3 + j / 3 ; if (rows[i][num] == 1 ){ return false ; }else { rows[i][num] = 1 ; } if (cols[j][num] == 1 ){ return false ; }else { cols[j][num] = 1 ; } if (box[index_box][num] == 1 ){ return false ; }else { box[index_box][num] = 1 ; } } } } return true ; } }
官方解题代码 迭代 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 class Solution { public boolean isValidSudoku (char [][] board) { HashMap<Integer, Integer> [] rows = new HashMap [9 ]; HashMap<Integer, Integer> [] columns = new HashMap [9 ]; HashMap<Integer, Integer> [] boxes = new HashMap [9 ]; for (int i = 0 ; i < 9 ; i++) { rows[i] = new HashMap <Integer, Integer>(); columns[i] = new HashMap <Integer, Integer>(); boxes[i] = new HashMap <Integer, Integer>(); } for (int i = 0 ; i < 9 ; i++) { for (int j = 0 ; j < 9 ; j++) { char num = board[i][j]; if (num != '.' ) { int n = (int )num; int box_index = (i / 3 ) * 3 + j / 3 ; rows[i].put(n, rows[i].getOrDefault(n, 0 ) + 1 ); columns[j].put(n, columns[j].getOrDefault(n, 0 ) + 1 ); boxes[box_index].put(n, boxes[box_index].getOrDefault(n, 0 ) + 1 ); if (rows[i].get(n) > 1 || columns[j].get(n) > 1 || boxes[box_index].get(n) > 1 ) return false ; } } } return true ; } }