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 '.'.

輸入一個二維數組表示的數獨版(board)。要求咱們判斷已經填入的數字是否知足數獨的規則。即知足每一行、每一列、每個粗線宮(3*3)內的數字均含1-9,不重複。沒有數字的格子用字符'.'表示。數組

例如:
clipboard.pngspa

想法

  • 這道題沒有什麼陷阱,主要的想法就是檢查每一行現有的元素、每一列現有的元素、每個粗線宮裏的現有元素有沒有重複。
  • 麻煩一點的解法就是咱們用三次遍歷分別檢查每一行、每一列、每一個粗線宮。可是這樣代碼比較複雜比較ugly,可是好理解呀~
  • 另外一種簡潔的想法把三種判斷在一次遍歷中完成。
  • 經過兩層循環能夠方便的檢查每一行和每一列有沒有重複數字。那咱們如何遍歷每一個粗線宮呢?
  • 由於臨時變量j的取值是從0-9,咱們能夠用'/'和'%'兩個操做符來代替完成遍歷粗線宮的行爲。
  • j/3的值做爲縱座標的增量,j%3的值做爲橫座標的增量。
  • 這樣對於一個粗線宮的左上角頂點來講,j從0~9就能夠完成對於整個粗線宮的遍歷。
  • 而後咱們仍須要肯定每個粗線宮的頂點。
  • 對於每一個i,(i/3)3做爲縱座標,(i%3)3做爲橫座標。這樣對於i從0~9,咱們能夠取到每個粗線宮的左上角了。

解法

  • 簡潔版~
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;
}
  • 複雜點~~
public boolean isValidSudoku(char[][] board) {
        boolean res = true;
        int length = 9;
        
        //判斷行
        for(int i=0;i<length;i++){
            HashSet<Character> temp = new HashSet<Character>();
            for(char c : board[i]){
                if(c != '.'){
                    if(!temp.add(c)){
                        return false;
                    }
                }
            }
        }
        
        //判斷列
        for(int i=0;i<length;i++){
            HashSet<Character> temp = new HashSet<Character>();
            for(int j=0;j<length;j++){
                char c = board[j][i];
                if(c != '.'){
                    if(!temp.add(c)){
                        return false;
                    }
                }               
            }
        }
        
        //判斷方塊
        int[][] center = {{1,1},{1,4},{1,7},{4,1},{4,4},{4,7},{7,1},{7,4},{7,7}};
        int[][] directs = {{-1,-1},{-1,0},{1,0},{0,-1},{0,0},{0,1},{1,-1},{1,0},{1,1}};
        
        for(int[] a :center){
            HashSet<Character> temp = new HashSet<Character>();
            for(int[] direct : directs){
                char c =board[direct[0]+a[0]][direct[1]+a[1]];
                if(c != '.'){
                    if(!temp.add(c)){
                        return false;
                    }
                }  
            }
        }

        
        return res;
    }
相關文章
相關標籤/搜索