返回
对 LeetCode 36 算法的解读与实现
前端
2023-09-25 05:00:48
算法原理
数独是一种经典的逻辑推理游戏,其规则如下:
- 数独由一个 9x9 的网格组成,该网格被分为 9 个 3x3 的子网格。
- 每个子网格必须包含从 1 到 9 的所有数字,且每个数字只能出现一次。
- 每行和每列也必须包含从 1 到 9 的所有数字,且每个数字只能出现一次。
有效的数独是指满足以上所有规则的数独谜题。
实现细节
我们可以在 Java 中使用一个二维数组来表示数独谜题,其中每个元素代表一个单元格中的数字。我们可以使用一个循环来遍历每个单元格,并检查其是否满足数独的规则。如果所有单元格都满足规则,那么该数独谜题就是有效的。
public class SudokuSolver {
private static final int GRID_SIZE = 9;
public boolean isValidSudoku(char[][] board) {
// 检查行
for (int i = 0; i < GRID_SIZE; i++) {
if (!isValidRow(board, i)) {
return false;
}
}
// 检查列
for (int j = 0; j < GRID_SIZE; j++) {
if (!isValidColumn(board, j)) {
return false;
}
}
// 检查子网格
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (!isValidSubgrid(board, i, j)) {
return false;
}
}
}
return true;
}
private boolean isValidRow(char[][] board, int row) {
Set<Character> seen = new HashSet<>();
for (int i = 0; i < GRID_SIZE; i++) {
char c = board[row][i];
if (c != '.' && !seen.add(c)) {
return false;
}
}
return true;
}
private boolean isValidColumn(char[][] board, int col) {
Set<Character> seen = new HashSet<>();
for (int i = 0; i < GRID_SIZE; i++) {
char c = board[i][col];
if (c != '.' && !seen.add(c)) {
return false;
}
}
return true;
}
private boolean isValidSubgrid(char[][] board, int row, int col) {
Set<Character> seen = new HashSet<>();
for (int i = row * 3; i < row * 3 + 3; i++) {
for (int j = col * 3; j < col * 3 + 3; j++) {
char c = board[i][j];
if (c != '.' && !seen.add(c)) {
return false;
}
}
}
return true;
}
}
复杂度分析
该算法的时间复杂度为 O(n^2),其中 n 是数独谜题的边长。这是因为该算法需要遍历每个单元格,并检查其是否满足数独的规则。
总结
LeetCode 36 是一个经典的数组处理算法,涉及到大量的逻辑思维。该算法的实现相对简单,但需要仔细考虑各种情况。本文对该算法进行了详细的解析,并给出了示例实现。希望对读者有所帮助。