【LeetCode】 36. 有效的數獨
阿新 • • 發佈:2021-09-17
請你判斷一個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 存在, 因此這個數獨是無效的。
提示:
board.length == 9
board[i].length == 9
board[i][j]
是一位數字或者'.'
陣列
public static boolean isValidSudoku(char[][] board) { if (board == null || board.length == 0 || board[0].length == 0) return false; boolean[][] row = new boolean[10][10]; boolean[][] col = new boolean[10][10]; boolean[][] area = new boolean[10][10]; for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { char c = board[i][j]; if (c == '.') continue; int tmp = c - '0'; int idx = i / 3 * 3 + j / 3; // 同一行,一列或者同一個3x3 宮內是否出現同一個數字 if (row[i][tmp] || col[j][tmp] || area[idx][tmp]) return false; row[i][tmp] = true; col[j][tmp] = true; area[idx][tmp] = true; } } return true; }
測試用例
public static void main(String[] args) {
char[][] board = new char[][]{{'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'}};
boolean isValid = IsValidSudoku.isValidSudoku(board);
System.out.println("IsValidSudoku demo01 result :" + isValid);
board = new char[][]{{'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'}};
isValid = IsValidSudoku.isValidSudoku(board);
System.out.println("IsValidSudoku demo02 result :" + isValid);
}
執行結果
IsValidSudoku demo01 result :true
IsValidSudoku demo02 result :false