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 ‘.’.

分析:

乍一看這個題感覺很難,但是其實只要分三種情況討論即可、
a.所有的行不包括重複數字
b.所有的列不包括重複數字
c.所有的小九宮格不包括重複數字

And Then 你會發現行列非常的好判斷,但是小九宮格怎麼判斷呢???
解釋:
觀察行號規律:

第0個九宮格:000111222; 第1個九宮格:000111222; 第2個九宮格:000111222;

第3個九宮格:333444555; 第4個九宮格:333444555; 第5個九宮格:333444555;

第6個九宮格:666777888; 第7個九宮格:666777888; 第8個九宮格:666777888;

可見對於每三個九宮格行號增3;對於單個九宮格,每三個格點行號增1。

因此第i個九宮格的第j個格點的行號可表示爲i/3*3+j/3

觀察列號規律:

第0個九宮格:012012012; 第1個九宮格:345345345; 第2個九宮格:678678678;

第3個九宮格:012012012; 第4個九宮格:345345345; 第5個九宮格:678678678;

第6個九宮格:012012012; 第7個九宮格:345345345; 第8個九宮格:678678678;

可見對於下個九宮格列號增3,循環週期爲3;對於單個九宮格,每個格點行號增1,週期也爲3。

週期的數學表示就是取模運算mod。
因此第i個九宮格的第j個格點的列號可表示爲i%3*3+j%3

另外:你又會問?
怎麼判斷是否重複呢???
這裏我們需要注意的是忘集合裏面插入元素如果重複插入會返回flase;
注意HashSet的創建的位置,每次for循環都需要重新創建。
代碼如下:

public boolean isValidSudoku(char[][] board) {

        for(int i = 0; i<9; i++){
            HashSet<Character> rows = new HashSet<Character>();
            HashSet<Character> columns = new HashSet<Character>();
            HashSet<Character> cube = new HashSet<Character>();
            for (int j = 0; j < 9;j++){
                if(board[i][j]!='.' && !rows.add(board[i][j]))
                    return false;
                if(board[j][i]!='.' && !columns.add(board[j][i]))
                    return false;
                int RowIndex = 3*(i/3);
                int ColIndex = 3*(i%3);
                if(board[RowIndex + j/3][ColIndex + j%3]!='.' && !cube.add(board[RowIndex + j/3][ColIndex + j%3]))
                    return false;
            }
        }
        return true;
    }
發佈了81 篇原創文章 · 獲贊 13 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章