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。

答案代码

略,和我的一样。

原文地址:https://www.cnblogs.com/Xieyang-blog/p/9001514.html