0036. Valid Sudoku
https://leetcode.com/problems/valid-sudoku
Description
Determine if a 9 x 9 Sudoku board is valid. Only the filled cells need to be validated according to the following rules:
Each row must contain the digits
1-9without repetition.Each column must contain the digits
1-9without repetition.Each of the nine
3 x 3sub-boxes of the grid must contain the digits1-9without repetition.
Note:
A Sudoku board (partially filled) could be valid but is not necessarily solvable.
Only the filled cells need to be validated according to the mentioned rules.
Example 1:
**Input:** 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"]]
**Output:** trueExample 2:
**Input:** 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"]]
**Output:** false
**Explanation:** Same as Example 1, except with the **5** in the top left corner being modified to **8**. Since there are two 8's in the top left 3x3 sub-box, it is invalid.Constraints:
board.length == 9board[i].length == 9board[i][j]is a digit1-9or'.'.
ac1: HashSet
set.add() will return boolean, to make your code consise
class Solution {
    public boolean isValidSudoku(char[][] board) {
        // 3 set: horizontal, vertical, matrix
        List<Set<Character>> hori = new ArrayList<Set<Character>>();
        List<Set<Character>> verti = new ArrayList<Set<Character>>();
        for (int i = 0; i < 9; i++) {
            hori.add(new HashSet<Character>());
            verti.add(new HashSet<Character>());
        }
        List<List<Set<Character>>> matr = new ArrayList<List<Set<Character>>>();
        for (int i = 0; i < 3; i++) {
            List<Set<Character>> tmp = new ArrayList<Set<Character>>();
            tmp.add(new HashSet<Character>());
            tmp.add(new HashSet<Character>());
            tmp.add(new HashSet<Character>());
            matr.add(tmp);
        }
        for (int r = 0; r < 9; r++) {
            for (int c = 0; c < 9; c++) {
                if (board[r][c] == '.') continue;
                if (hori.get(r).contains(board[r][c])){
                    return false;
                } else {
                    hori.get(r).add(board[r][c]);
                }
                if (verti.get(c).contains(board[r][c])){
                    return false;
                } else {
                    verti.get(c).add(board[r][c]);
                }
                if (matr.get(r/3).get(c/3).contains(board[r][c])) return false;
                else matr.get(r/3).get(c/3).add(board[r][c]);
            }
        }
        return true;
    }
}ac2: boolean[][]
faster and concise
class Solution {
    public boolean isValidSudoku(char[][] board) {
        // 3 boolean matrix
        // check current char is used or not
        boolean[][] hori = new boolean[9][10];
        boolean[][] verti = new boolean[9][10];
        boolean[][] cube = new boolean[9][10];
        for (int r = 0; r < 9; r++) {
            for (int c = 0; c < 9; c++) {
                if (board[r][c] == '.') continue;
                int val = board[r][c] - '0';
                int cubeIdx = (r/3) * 3 + c/3;
                if (hori[r][val] || verti[c][val] || cube[cubeIdx][val]) return false;
                hori[r][val] = true;
                verti[c][val] = true;
                cube[cubeIdx][val] = true;
            }
        }
        return true;
    }
}Last updated
Was this helpful?