• LeetCode第[36]题(Java):Valid Sudoku


    题目:有效的数独表

    难度:Medium

    题目内容

    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.

    翻译:简单翻译下就是,给出一张数独表,判断是否有效。

    不需要判断是否有解,只需判断它的三个标准内已经出现的数字是否唯一即可

    我的思路:本题其实不难,不过题目的意思很难懂,仔细理解了就好了。

        在三个标准内判断是否唯一,那么就需要三个数组,并且每一个数组都应该是二维的,第一维表示是第几个长条(方形),第二维度表示是长条(方形)内的第几个元素。

        三个标准分别是,行、列、块。

        对数独表的每一个元素进行循环,每一个元素都在三个标准内都有对应的元素,每次循环都对此三个标准内对应的值设置为true(已经使用),如果发现对应的值已经被设置为true,则立即返回flase表明此表是无效的。

        当前值减去“1”则能表示第二维度的值

    问题在于如何用元素在数独表的位置【i】【j】表示三个标准第一维度的值:

    行:【i】

    列:【j】

    块:  行数与列数不一样,行数对三的商决定了是从第几个三开始往后数,列数决定了数几个所以为【i/3*3 + j/3】

    MyCode

     1     public boolean isValidSudoku(char[][] board) {
     2         
     3        boolean[][] row = new boolean[9][9];
     4        boolean[][] column = new boolean[9][9];
     5        boolean[][] block = new boolean[9][9];
     6        
     7        for(int i = 0;i<9;i++){
     8            for(int j=0;j<9;j++){
     9                 int c = board[i][j] - '1';       
    10                 if(board[i][j]=='.'){
    11                     continue;
    12                 }
    13                 int loc = i/3*3 + j/3;
    14                 if(row[i][c]||column[j][c]||block[loc][c]){
    15                     return false;
    16                 }
    17                 row[i][c] = column[j][c] = block[loc][c] = true;
    18            }
    19        }
    20        return true;
    21     }

    我的算法复杂度:O(N2

    编码过程中出现的问题

    1、一开始想用一维数组,然后每个元素都是set,用set来判断,但是发现操作起来比较麻烦。当已经知道要放入的元素的范围,且范围不大的时候应该用数组代替Set。

    2、想第二维度如何取值的时候想了很久。当元素为char或者String的数字,用来计数(判唯一)的时候,可以考虑减去“<最小值>”,转为相对值。此处最小值为1。

    答案代码

    略,和我的一样。

  • 相关阅读:
    Java 嵌套循环之九九乘法表
    Java switch语句第二种用法
    Java switch语句
    Java if-else if-else多选择结构代码
    Java if else双选择结构之计算圆的面积和周长
    Java if单选择结构---掷色子游戏
    在webstorm11中使用nodejs库的智能提示功能
    Node.JS 学习路线图
    Nodejs系列课程,从入门到进阶帮你打通全栈
    使用supervisor提高nodejs调试效率
  • 原文地址:https://www.cnblogs.com/Xieyang-blog/p/9001514.html
Copyright © 2020-2023  润新知