
以下是 LeetCode 36 题「有效的数独」的 Java 实现使用三个布尔数组分别记录每行、每列和每个 3×3 宫中数字是否已经出现过。classSolution{publicbooleanisValidSudoku(char[][]board){// rows[i][num] 表示第 i 行数字 num1 是否已出现boolean[][]rowsnewboolean[9][9];// cols[j][num] 表示第 j 列数字 num1 是否已出现boolean[][]colsnewboolean[9][9];// boxes[k][num] 表示第 k 个 3x3 宫数字 num1 是否已出现boolean[][]boxesnewboolean[9][9];for(inti0;i9;i){for(intj0;j9;j){charcboard[i][j];if(c.){continue;// 跳过空格}intnumc-1;// 将字符 1~9 映射为索引 0~8intboxIndex(i/3)*3j/3;// 计算所在宫的索引// 如果该数字在当前行、列或宫中已经出现过则数独无效if(rows[i][num]||cols[j][num]||boxes[boxIndex][num]){returnfalse;}// 标记该数字已出现rows[i][num]true;cols[j][num]true;boxes[boxIndex][num]true;}}returntrue;}}思路说明· 遍历整个 9×9 棋盘对于每个非空格将其转换为数字索引0~8。· 使用三个二维布尔数组· rows[i][num]第 i 行是否已有数字 num1。· cols[j][num]第 j 列是否已有数字 num1。· boxes[k][num]第 k 个 3×3 宫是否已有数字 num1其中 k (i/3)*3 j/3。· 若发现重复立即返回 false否则标记并继续最终返回 true。复杂度分析· 时间复杂度O(1)因为棋盘大小固定为 9×9遍历 81 个格子。· 空间复杂度O(1)使用了固定大小的布尔数组9×9×3。