题解转载自宫水三叶
哈希表解法
由于只要我们判断是否为有效的数独。
所以我们只需要对 board 中出现的数进行判断,如果 board 中有数违反了数独的规则,返回 false,否则返回 true。
直观上,我们很容易想到使用哈希表来记录某行/某列/某个小方块出现过哪些数字,来帮助我们判断是否符合「有效数独」的定义。
这道题唯一的难点可能是在于如何确定某个数落在哪个小方块中,我们可以去小方块进行编号:
注意:
然后推导出小方块编号和行列的关系为: idx = i / 3 * 3 + j / 3。
int c = board[i][j] - ‘1’;细节,这样就能将数字1~9 对应下标0~8了
class Solution {
public boolean isValidSudoku(char[][] board) {
Map<Integer, Set<Integer>> row = new HashMap<>(), col = new HashMap<>(), area = new HashMap<>();
for (int i = 0; i < 9; i++) {
row.put(i, new HashSet<>());
col.put(i, new HashSet<>());
area.put(i, new HashSet<>());
}
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (board[i][j] == '.') continue;
int c = board[i][j] - '1';
int idx = i / 3 * 3 + j / 3;
if (!row.get(i).contains(c) && !col.get(j).contains(c) && !area.get(idx).contains(c)) {
row.get(i).add(c);
col.get(j).add(c);
area.get(idx).add(c);
} else {
return false;
}
}
}
return true;
}
}