返回

对 LeetCode 36 算法的解读与实现

前端

算法原理

数独是一种经典的逻辑推理游戏,其规则如下:

  1. 数独由一个 9x9 的网格组成,该网格被分为 9 个 3x3 的子网格。
  2. 每个子网格必须包含从 1 到 9 的所有数字,且每个数字只能出现一次。
  3. 每行和每列也必须包含从 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 是一个经典的数组处理算法,涉及到大量的逻辑思维。该算法的实现相对简单,但需要仔细考虑各种情况。本文对该算法进行了详细的解析,并给出了示例实现。希望对读者有所帮助。