# LeetCode第[36]题(Java)：Valid Sudoku

2018/05/07 11:00

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”则能表示第二维度的值

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     }

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

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

0
0 收藏

0 评论
0 收藏
0