1. 程式人生 > 其它 >LeetCode 36. 有效的數獨

LeetCode 36. 有效的數獨

技術標籤:java

判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。

數字 1-9 在每一行只能出現一次。
數字 1-9 在每一列只能出現一次。
數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。

在這裡插入圖片描述

示例 1:

輸入:
[
  ["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: 輸入: [ ["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 存在, 因此這個數獨是無效的。 說明: 一個有效的數獨(部分已被填充)不一定是可解的。 只需要根據以上規則,驗證已經填入的數字是否有效即可。 給定數獨序列只包含數字 1-9 和字元 '.' 。 給定數獨永遠是 9x9 形式的。 來源:力扣(LeetCode) 連結:https://leetcode-cn.com/problems/valid-sudoku 著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
class Solution {
    public boolean isValidSudoku(char[][] board) {
        Map<Character,Boolean> row=new HashMap<>();
        Map<Character,Boolean> col=new HashMap<>();
        Map<Character,Boolean> box[]=new HashMap[9];
        
        for(int i=0;i<9;i++) box[i]=new HashMap<Character, Boolean>();
        
        //對所有行進行判斷
        for(int i=0;i<9;i++){
            row.clear();
            for(int j=0;j<9;j++){
            	if(board[i][j]=='.') continue;
            	if(row.containsKey(board[i][j])) return false;
            	row.put(board[i][j], true);
            }
        }
        
        //對所有列進行判斷
        for(int i=0;i<9;i++){
            col.clear();
            for(int j=0;j<9;j++){
            	if(board[j][i]=='.') continue;
            	if(col.containsKey(board[j][i])) return false;
            	col.put(board[j][i], true);
            }
        }
        
        //對粗線分割的九宮格進行判斷
        for(int i=0;i<9;i++){
            for(int j=0;j<9;j++){
            	if(board[i][j]=='.') continue;
            	int boxIndex=(i/3)*3+j/3;
            	if(box[boxIndex].containsKey(board[i][j])) return false;
            	box[boxIndex].put(board[i][j], true);
            }
        }
        return true;
    }
}