Algorithms first
有效的数独 · 交互式算法学习
判断已填数字是否满足行、列、九宫格均不重复。
#36 · 矩阵
有效的数独
Valid Sudoku
board = 9×9 数独局面矩阵3 个关键状态
步骤 1把 5 登记到第 0 行、列和宫。
rows[0]={5}50,0
30,1
·0,2
·1,0
71,1
·1,2
·2,0
·2,1
·2,2
推荐
行列宫集合
时间
O(81)空间 O(81)扫描一次,把数字分别登记到行、列和宫的集合。
1function isValidSudoku(b) {2 const rows = Array.from({3 length: 94 }, () => new Set()),5 cols = Array.from({6 length: 97 }, () => new Set()),8 boxes = Array.from({9 length: 910 }, () => new Set());11 for (let r = 0; r < 9; r++)12 for (let c = 0; c < 9; c++) {13 const x = b[r][c],14 k = Math.floor(r / 3) * 3 + Math.floor(c / 3);15 if (x !== '.') {16 if (rows[r].has(x) || cols[c].has(x) || boxes[k].has(x)) return false;17 rows[r].add(x);18 cols[c].add(x);19 boxes[k].add(x);20 }21 }22 return true;23}多语言参考
来源 · CC BY-SA 4.0 ↗Java · C++ · Go
这是一组同题正确实现,独立于上方当前动画方法;不同语言可能采用另一种正确策略。
1class Solution {2 public boolean isValidSudoku(char[][] board) {3 boolean[][] row = new boolean[9][9];4 boolean[][] col = new boolean[9][9];5 boolean[][] sub = new boolean[9][9];6 for (int i = 0; i < 9; ++i) {7 for (int j = 0; j < 9; ++j) {8 char c = board[i][j];9 if (c == '.') {10 continue;11 }12 int num = c - '0' - 1;13 int k = i / 3 * 3 + j / 3;14 if (row[i][num] || col[j][num] || sub[k][num]) {15 return false;16 }17 row[i][num] = true;18 col[j][num] = true;19 sub[k][num] = true;20 }21 }22 return true;23 }24}交互式算法学习
从执行步骤真正理解 LeetCode 经典 150
本站整理 150 道高频算法面试题和 302 种解法。动画方法同步展示 JavaScript 与 Python;每题另提供 Java、C++ 与 Go 同题参考实现。
AlgoViz Lab
有效的数独 · 解法对比
判断已填数字是否满足行、列、九宫格均不重复。
- 测试用例
board = 9×9 数独局面- 题目分类
- 矩阵
- 解法对比
- 2
逐单元格三次扫描
对每个数字重新检查所在行、列和宫格。
- 时间
O(81×9)- 空间
O(1)
行列宫集合
扫描一次,把数字分别登记到行、列和宫的集合。
- 时间
O(81)- 空间
O(81)