• 【LeetCode】36. Valid Sudoku


    Difficulty: Medium

     More:【目录】LeetCode Java实现

    Description

    https://leetcode.com/problems/valid-sudoku/

    Determine if a 9x9 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 9 3x3 sub-boxes of the grid must contain the digits 1-9 without repetition.


    A partially filled sudoku which is valid.

    The Sudoku board could be partially filled, where empty cells are filled with the character '.'.

    Example 1:

    Input:
    [
      ["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:
    [
      ["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.
    

    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.
    • The given board contain only digits 1-9 and the character '.'.
    • The given board size is always 9x9.

    Intuition

    Mehtod 1: Use three hashSet (rowSet, colSet, boxSet) to store  digits in each row/ column/ sub-box.

    Details: 

      i: 1 ->9   j: i ->9

      rowSet: a[i][j]

      colSet: a[j][i]

      boxSet: 

        For a given sub-box, we can traverse a 3*3 sub-box using just j: a[ j/3 ] [ j%3 ]

        We has 9 sub-boxes, so we can use i to switch in different sub-boxes: a[i/3*3+j/3][i%3*3+j%3]

    Mehtod 2: Use only one hashSet to store a[i][j] in three ways.

      Encode a[i][j] as a[i][j]+"r"+i  to represent a[i][j] in row i;

      Encode a[i][j] as a[i][j]+"c"+j  to represent a[i][j] in colum j; 

      Encode a[i][j] as a[i][j]+"box"+i/3+j/3  to represent a[i][j] in box-i/3-j/3; 

    Solution

        //Method 1
        public boolean isValidSudoku(char[][] board) {
            for(int i=0; i<9; i++){
                HashSet<Character> rowSet = new HashSet<>();
                HashSet<Character> colSet = new HashSet<>();
                HashSet<Character> boxSet = new HashSet<>();
                for(int j=0; j<9; j++){
                    if(board[i][j]!='.' && !rowSet.add(board[i][j]))
                        return false;
                    if(board[j][i]!='.' && !colSet.add(board[j][i]))
                        return false;
                    if(board[i/3*3+j/3][i%3*3+j%3]!='.' && !boxSet.add(board[i/3*3+j/3][i%3*3+j%3]))
                        return false;
                }
            }
            return true;
        }
        
        //Method 2: easier to understand
        public boolean isValidSudoku(char[][] board) {
            HashSet<String> set = new HashSet<>();
            for(int i=0; i<9; i++){
                for(int j=0; j<9; j++){
                    if(board[i][j]!='.'){
                        String num = String.valueOf(board[i][j]);
                        if(!set.add(num+"r"+i) || !set.add(num+"c"+j) || !set.add(num+"box"+i/3+j/3))
                            return false;                    
                    }
                }
            }
            return true;
        }
    

      

    Complexity

    Time complexity : O(n)

    Space complexity : O(n)

     

    What I've learned

    1. Learn how to use i, j to represent elements in different rows and columns and sub-boxes.

    2. For a given sub-box, we can traverse a 3*3 sub-box using just ja[ j/3 ] [ j%3 ]

    3. It's clever to store elements in a hashSet by convert elements to String.

     More:【目录】LeetCode Java实现

  • 相关阅读:
    为什么编程是独一无二的职业
    TSQL 编程规范
    Windows实战Git环境配置msysGit+TortoiseGit
    Linux环境下Socket编程
    数据持久化
    Javascript类的定义和引用
    详解C中volatile关键字
    ACM HDU 1040 As Easy As A+B
    ACM POJ 1753Flip Game
    ACM HDU 1017 A Mathematical Curiosity
  • 原文地址:https://www.cnblogs.com/yongh/p/11642259.html
Copyright © 2020-2023  润新知