返回
LeetCode 36 有效的数独
前端
2023-11-24 14:26:29
**前言**
LeetCode 36 “有效的数独”是一道经典的数组类型题目,难度为中等。它要求你判断一个 9x9 的数独游戏是否有效。数独游戏是一种逻辑游戏,由一个 9x9 的网格组成,其中一些单元格已经填入数字,其他单元格则为空。玩家需要根据已填入的数字,推理出其他单元格的数字,使得每个 3x3 的子网格、每一行和每一列都包含数字 1-9,且不重复。
**解题思路**
解决 LeetCode 36 的关键在于理解数独游戏的规则并将其转化为代码。以下是常见的解题思路:
1. **遍历数独网格,检查每个单元格。**
- 对于每个单元格,如果它是空的,则跳过它。
- 如果单元格已填入数字,则检查该数字是否有效。
2. **检查单元格中的数字是否有效。**
- 一个单元格中的数字是有效的,如果它满足以下条件:
- 数字在 1 到 9 之间。
- 数字在该单元格所在的 3x3 子网格中不重复。
- 数字在该单元格所在的每一行和每一列中不重复。
3. **如果所有单元格中的数字都是有效的,那么数独游戏是有效的。**
**技巧**
1. **使用数据结构来存储已填入数字的位置。**
- 您可以使用哈希表或集合来存储已填入数字的位置。这将有助于您快速检查一个数字是否在某个子网格、行或列中重复。
2. **使用循环来遍历数独网格。**
- 您可以使用嵌套循环来遍历数独网格。外层循环遍历行,内层循环遍历列。
3. **使用条件语句来检查单元格中的数字是否有效。**
- 您可以使用条件语句来检查单元格中的数字是否在 1 到 9 之间,是否在该单元格所在的 3x3 子网格中重复,是否在该单元格所在的每一行和每一列中重复。
**代码实现**
以下是使用 JavaScript 实现的 LeetCode 36 “有效的数独”问题的代码:
```javascript
/**
* 检查数独游戏是否有效。
*
* @param {number[][]} board 数独游戏网格。
* @return {boolean} 数独游戏是否有效。
*/
const isValidSudoku = (board) => {
// 检查每个单元格
for (let i = 0; i < 9; i++) {
for (let j = 0; j < 9; j++) {
const value = board[i][j];
// 跳过空的单元格
if (value === 0) {
continue;
}
// 检查单元格中的数字是否有效
if (!isValidCell(board, i, j, value)) {
return false;
}
}
}
// 所有单元格中的数字都是有效的,则数独游戏有效
return true;
};
/**
* 检查单元格中的数字是否有效。
*
* @param {number[][]} board 数独游戏网格。
* @param {number} row 单元格所在的行。
* @param {number} col 单元格所在的列。
* @param {number} value 单元格中的数字。
* @return {boolean} 单元格中的数字是否有效。
*/
const isValidCell = (board, row, col, value) => {
// 检查数字是否在 1 到 9 之间
if (value < 1 || value > 9) {
return false;
}
// 检查数字是否在单元格所在的 3x3 子网格中重复
const subgridRow = Math.floor(row / 3) * 3;
const subgridColumn = Math.floor(col / 3) * 3;
for (let i = subgridRow; i < subgridRow + 3; i++) {
for (let j = subgridColumn; j < subgridColumn + 3; j++) {
if (board[i][j] === value && (i !== row || j !== col)) {
return false;
}
}
}
// 检查数字是否在单元格所在的每一行和每一列中重复
for (let i = 0; i < 9; i++) {
if (board[row][i] === value && i !== col) {
return false;
}
if (board[i][col] === value && i !== row) {
return false;
}
}
// 数字是有效的
return true;
};
总结
LeetCode 36 “有效的数独”是一道经典的数组类型题目,需要你理解数独游戏的规则并将其转化为代码。您可以使用数据结构来存储已填入数字的位置,使用循环来遍历数独网格,并使用条件语句来检查单元格中的数字是否有效。
希望本篇文章对您有所帮助,如果您有任何问题或建议,请随时留言。