ps:题目来自力扣
请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。
- 数字
1-9在每一行只能出现一次。 - 数字
1-9在每一列只能出现一次。 - 数字
1-9在每一个以粗实线分隔的3x3宫内只能出现一次。(请参考示例图) -
注意:
- 一个有效的数独(部分已被填充)不一定是可解的。
- 只需要根据以上规则,验证已经填入的数字是否有效即可。
- 空白格用
'.'表示。
class Solution { public boolean isValidSudoku(char[][] board) { // 检查每一行 for (int i = 0; i < 9; i++) { boolean[] used = new boolean[9]; for (int j = 0; j < 9; j++) { if (board[i][j] != '.') { int num = board[i][j] - '1'; if (used[num]) { return false; } used[num] = true; } } } // 检查每一列 for (int j = 0; j < 9; j++) { boolean[] used = new boolean[9]; for (int i = 0; i < 9; i++) { if (board[i][j] != '.') { int num = board[i][j] - '1'; if (used[num]) { return false; } used[num] = true; } } } // 检查每一个 3x3 宫 for (int blockRow = 0; blockRow < 3; blockRow++) { for (int blockCol = 0; blockCol < 3; blockCol++) { boolean[] used = new boolean[9]; for (int i = blockRow * 3; i < blockRow * 3 + 3; i++) { for (int j = blockCol * 3; j < blockCol * 3 + 3; j++) { if (board[i][j] != '.') { int num = board[i][j] - '1'; if (used[num]) { return false; } used[num] = true; } } } } } return true; } }
代码解释
本题要求判断一个 9x9 的数独是否有效,需要分别检查每一行、每一列以及每一个 3x3 宫是否满足数字 1 - 9 只出现一次的规则。
具体步骤
-
检查每一行:
- 使用一个
for循环遍历每一行,对于每一行,创建一个长度为 9 的布尔数组used,用于标记数字 1 - 9 是否已经出现过。 - 再使用一个嵌套的
for循环遍历该行的每一个元素,如果该元素不是.(表示未填数字),将其转换为对应的数字索引num(通过减去字符'1')。 - 检查
used[num]是否为true,如果是,则说明该数字已经在该行出现过,返回false;否则,将used[num]标记为true。
- 使用一个
-
检查每一列:
- 同样使用一个
for循环遍历每一列,对于每一列,创建一个新的布尔数组used。 - 使用嵌套的
for循环遍历该列的每一个元素,按照与检查行相同的方式进行数字检查。
- 同样使用一个
-
检查每一个 3x3 宫:
- 使用两层嵌套的
for循环遍历每一个 3x3 宫,外层循环控制宫的行索引blockRow,内层循环控制宫的列索引blockCol。 - 对于每一个 3x3 宫,创建一个布尔数组
used。 - 使用两层嵌套的
for循环遍历该 3x3 宫内的每一个元素,同样进行数字检查。
- 使用两层嵌套的
-
返回结果:
- 如果以上所有检查都通过,说明数独有效,返回
true。
- 如果以上所有检查都通过,说明数独有效,返回
1万+

被折叠的 条评论
为什么被折叠?



