2020-06-17
有效的数独
判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可
- 数字 1-9 在每一行只能出现一次。
- 数字 1-9 在每一列只能出现一次。
- 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
上图是一个部分填充的有效的数独。
数独部分空格内已填入了数字,空白格用 '.' 表示。
说明- 一个有效的数独(部分已被填充)不一定是可解的。
- 只需要根据以上规则,验证已经填入的数字是否有效即可。
- 给定数独序列只包含数字 1-9 和字符 '.' 。
- 给定数独永远是 9x9 形式的。
题解:
思路1:哈希表
var isValidSudoku = function (board) { let hash1 = new Array(9), // 3个hash表分别对应每一行 每一列 每一格 hash2 = new Array(9), // 千万别用fill({}) fill出来的是同一个对象~~~~ hash3 = new Array(9), tmp, i3; // tmp当前遍历项的值 i3 是hash3对应的第几个方格 for (let i = 0; i < board.length; i++) { hash1[i] = {}; // i表示每一行 每次进入新的一行 hash1[i] 赋值为空对象 for (let j = 0; j < board.length; j++) { if (i === 0) hash2[j] = {}; // 当 i = 0 时 hash2 每一列都没有赋值 为每一列赋值空对象 tmp = board[i][j]; if (tmp === '.') continue; // 空则继续 if (!hash1[i][tmp]) hash1[i][tmp] = 1; // 如果第i行还没出现过这个值 赋值1 else return false; // 如果出现过 说明一行出现两个相同值 return false if (!hash2[j][tmp]) hash2[j][tmp] = 1; // 如果第j列没出现过这个值 赋值1 else return false; // 如果出现过 说明一列出现两个相同值 return false i3 = Math.floor(i / 3) * 3 + Math.floor(j / 3); // i3计算当前i j对应的是第几个小方格 if (!hash3[i3]) hash3[i3] = {}; if (!hash3[i3][tmp]) hash3[i3][tmp] = 1; // 如果当前方格没有出现过该值 赋值1 else return false; // 同理 } } return true; // 遍历结束后都没触发过return false 说明是有效的数独 };