All Downloads are FREE. Search and download functionalities are using the official Maven repository.

g0001_0100.s0036_valid_sudoku.Solution Maven / Gradle / Ivy

There is a newer version: 1.38
Show newest version
package g0001_0100.s0036_valid_sudoku;

// #Medium #Top_Interview_Questions #Array #Hash_Table #Matrix #Data_Structure_I_Day_5_Array
// #2023_08_09_Time_1_ms_(100.00%)_Space_43.8_MB_(30.47%)

/**
 * 36 - Valid Sudoku\.
 *
 * Medium
 *
 * Determine if a `9 x 9` Sudoku board is valid. Only the filled cells need to be validated **according to the following rules**:
 *
 * 1.  Each row must contain the digits `1-9` without repetition.
 * 2.  Each column must contain the digits `1-9` without repetition.
 * 3.  Each of the nine `3 x 3` sub-boxes of the grid must contain the digits `1-9` without 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:**
 *
 * ![](https://upload.wikimedia.org/wikipedia/commons/thumb/f/ff/Sudoku-by-L2G-20050714.svg/250px-Sudoku-by-L2G-20050714.svg.png)
 *
 * **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:** true 
 *
 * **Example 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 == 9`
 * *   `board[i].length == 9`
 * *   `board[i][j]` is a digit `1-9` or `'.'`.
**/
public class Solution {
    private int j1;
    private int[] i1 = new int[9];
    private int[] b1 = new int[9];

    public boolean isValidSudoku(char[][] board) {
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                boolean res = checkValid(board, i, j);
                if (!res) {
                    return false;
                }
            }
        }
        return true;
    }

    private boolean checkValid(char[][] board, int i, int j) {
        if (j == 0) {
            j1 = 0;
        }
        if (board[i][j] == '.') {
            return true;
        }
        int val = board[i][j] - '0';
        if (j1 == (j1 | (1 << (val - 1)))) {
            return false;
        }
        j1 |= 1 << (val - 1);
        if (i1[j] == (i1[j] | (1 << (val - 1)))) {
            return false;
        }
        i1[j] |= 1 << (val - 1);
        int b = (i / 3) * 3 + j / 3;
        if (b1[b] == (b1[b] | (1 << (val - 1)))) {
            return false;
        }
        b1[b] |= 1 << (val - 1);
        return true;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy