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}
多语言参考

Java · C++ · Go

来源 · CC BY-SA 4.0 ↗

这是一组同题正确实现,独立于上方当前动画方法;不同语言可能采用另一种正确策略。

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 同题参考实现。

多形态可视化数组、矩阵、DP 表、递归树、树图、链表、栈队列堆、区间和状态机按解法选择。
动画与代码同步当前状态、步骤说明、变量和代码高亮保持一一对应,可逐步播放和回退。
适合面试复习每种方案都给出思路、时间复杂度、空间复杂度、测试用例和 LeetCode 中文原题入口。
AlgoViz Lab

有效的数独 · 解法对比

判断已填数字是否满足行、列、九宫格均不重复。

测试用例
board = 9×9 数独局面
题目分类
矩阵
解法对比
2
方案 1

逐单元格三次扫描

对每个数字重新检查所在行、列和宫格。

时间
O(81×9)
空间
O(1)
方案 2

行列宫集合

扫描一次,把数字分别登记到行、列和宫的集合。

时间
O(81)
空间
O(81)