目录
解题思路与实现 - 有效的数独
问题描述
判断一个 9 x 9 的数独是否有效,根据以下规则验证已经填入的数字是否有效:
- 数字 1-9 在每一行只能出现一次。
- 数字 1-9 在每一列只能出现一次。
- 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
示例
示例 1:
输入:
[
["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"]
]
输出:true
示例 2:
输入:
[
["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"]
]
输出:false
解题思路
- 遍历数独,分别使用三个二维数组
rows
、cols
和boxes
来记录每行、每列以及每个 3x3 宫内出现的数字情况。 - 对于每个数字,判断它在当前行、当前列和当前 3x3 宫内是否已经出现过,若出现过则说明数独无效。
- 遍历结束后,若没有发现任何冲突,则数独有效。
算法实现
java
public boolean isValidSudoku(char[][] board) {
boolean[][] rows = new boolean[9][9];
boolean[][] cols = new boolean[9][9];
boolean[][] boxes = new boolean[9][9];
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (board[i][j] != '.') {
int num = board[i][j] - '1';
int boxIndex = (i / 3) * 3 + (j / 3);
if (rows[i][num] || cols[j][num] || boxes[boxIndex][num]) {
return false; // 重复出现
}
rows[i][num] = true;
cols[j][num] = true;
boxes[boxIndex][num] = true;
}
}
}
return true;
}
复杂度分析
- 时间复杂度:O(1),因为固定为 9 x 9 的数独,算法的时间复杂度是常数级别的。
- 空间复杂度:O(1),同样因为固定为 9 x 9 的数独,额外空间的大小也是常数级别的。
测试与验证
设计不同的数独输入,包括有效的和无效的情况,验证算法的正确性和效率。
总结
通过本文的详细解题思路和算法实现,可以有效地判断给定的数独是否有效。利用三个二维数组记录每行、每列和每个 3x3 宫内的数字出现情况,然后进行遍历验证,实现了对数独的有效性检查。