返回

LeetCode 36 有效的数独

前端







**前言** 

LeetCode 36 “有效的数独”是一道经典的数组类型题目,难度为中等。它要求你判断一个 9x9 的数独游戏是否有效。数独游戏是一种逻辑游戏,由一个 9x9 的网格组成,其中一些单元格已经填入数字,其他单元格则为空。玩家需要根据已填入的数字,推理出其他单元格的数字,使得每个 3x3 的子网格、每一行和每一列都包含数字 1-9,且不重复。

**解题思路** 

解决 LeetCode 36 的关键在于理解数独游戏的规则并将其转化为代码。以下是常见的解题思路:

1. **遍历数独网格,检查每个单元格。** 

   - 对于每个单元格,如果它是空的,则跳过它。
   - 如果单元格已填入数字,则检查该数字是否有效。

2. **检查单元格中的数字是否有效。** 

   - 一个单元格中的数字是有效的,如果它满足以下条件:
     - 数字在 19 之间。
     - 数字在该单元格所在的 3x3 子网格中不重复。
     - 数字在该单元格所在的每一行和每一列中不重复。

3. **如果所有单元格中的数字都是有效的,那么数独游戏是有效的。** 

**技巧** 

1. **使用数据结构来存储已填入数字的位置。** 

   - 您可以使用哈希表或集合来存储已填入数字的位置。这将有助于您快速检查一个数字是否在某个子网格、行或列中重复。

2. **使用循环来遍历数独网格。** 

   - 您可以使用嵌套循环来遍历数独网格。外层循环遍历行,内层循环遍历列。

3. **使用条件语句来检查单元格中的数字是否有效。** 

   - 您可以使用条件语句来检查单元格中的数字是否在 19 之间,是否在该单元格所在的 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 “有效的数独”是一道经典的数组类型题目,需要你理解数独游戏的规则并将其转化为代码。您可以使用数据结构来存储已填入数字的位置,使用循环来遍历数独网格,并使用条件语句来检查单元格中的数字是否有效。

希望本篇文章对您有所帮助,如果您有任何问题或建议,请随时留言。