hgq's docs
主页
ES6-阮一峰 (opens new window)
Vue文档 (opens new window)
Axios文档 (opens new window)
Vue Router (opens new window)
Vuex文档 (opens new window)
面试题-Vue (opens new window)
面试题-JS (opens new window)

guoguoqiqi

漫不经心的向往
主页
ES6-阮一峰 (opens new window)
Vue文档 (opens new window)
Axios文档 (opens new window)
Vue Router (opens new window)
Vuex文档 (opens new window)
面试题-Vue (opens new window)
面试题-JS (opens new window)
  • 插入排序
  • 归并排序
  • 快速排序
  • 冒泡排序
  • 选择排序
  • 两数之和
  • 两数相加
  • 无重复字符的最长子串
  • 寻找两个正序数组的中位数
  • 最长回文子串
  • Z 字形变换
  • 整数反转
  • 字符串转换整数 (atoi)
  • 回文数
  • 盛最多水的容器
  • 整数转罗马数字
  • 罗马数字转整数
  • 最长公共前缀
  • 三数之和
  • 最接近的三数之和
  • 电话号码的字母组合
  • 四数之和
  • 删除链表的倒数第 N 个结点
  • 有效的括号
  • 合并两个有序链表
  • 括号生成
  • 合并K个升序链表
  • 两两交换链表中的节点
  • 删除有序数组中的重复项
  • 移除元素
  • 实现 strStr()
  • 两数相除
  • 下一个排列
  • 最长有效括号
  • 搜索旋转排序数组
  • 在排序数组中查找元素的第一个和最后一个位置
  • 搜索插入位置
  • 有效的数独
  • 解数独
  • 外观数列
  • 组合总和
  • 组合总和 II
  • 接雨水
  • 字符串相乘
  • 跳跃游戏 II
  • 全排列
  • 全排列 II
  • 旋转图像
  • Pow(x, n)
  • 最大子数组和
  • 螺旋矩阵
  • 跳跃游戏
  • 合并区间
  • 插入区间
  • 最后一个单词的长度
  • 螺旋矩阵 II
  • 排列序列
  • 旋转链表
  • 不同路径
  • 不同路径 II
  • 最小路径和
  • 加一
  • 二进制求和
  • x 的平方根
  • 爬楼梯
  • 矩阵置零
  • 搜索二维矩阵
  • 颜色分类
  • 组合
  • 子集
  • 单词搜索
  • 删除有序数组中的重复项 II
  • 搜索旋转排序数组 II
  • 删除排序链表中的重复元素 II
  • 删除排序链表中的重复元素
  • 分隔链表
  • 合并两个有序数组
  • 子集 II
  • 解码方法
  • 反转链表 II
  • 二叉树的中序遍历
  • 不同的二叉搜索树
  • 验证二叉搜索树
  • 恢复二叉搜索树
  • 相同的树
  • 对称二叉树
  • 二叉树的层序遍历
  • 二叉树的最大深度
  • 从前序与中序遍历序列构造二叉树
  • 从中序与后序遍历序列构造二叉树
  • 二叉树的层序遍历 II
  • 将有序数组转换为二叉搜索树
  • 有序链表转换二叉搜索树
  • 平衡二叉树
  • 二叉树的最小深度
  • 路径总和
  • 路径总和 II
  • 杨辉三角
  • 杨辉三角 II
  • 验证回文串
  • 最长连续序列
  • 只出现一次的数字
  • 只出现一次的数字 II
  • 环形链表
  • 环形链表 II
  • 二叉树的前序遍历
  • 二叉树的后序遍历
  • 相交链表
  • 寻找峰值
  • 两数之和 II - 输入有序数组
  • 多数元素
  • 重复的DNA序列
  • 移除链表元素
  • 反转链表
  • 组合总和 III
  • 存在重复元素
  • 存在重复元素 II
  • 矩形面积
  • 翻转二叉树
  • 求众数 II
  • 二叉搜索树中第K小的元素
  • 用栈实现队列
  • 回文链表
  • 二叉搜索树的最近公共祖先
  • 二叉树的最近公共祖先
  • 删除链表中的节点
  • 搜索二维矩阵 II
  • 二叉树的所有路径
  • 只出现一次的数字 III
  • 丢失的数字
  • 寻找重复数
  • Nim 游戏
  • 最长递增子序列
  • 最大单词长度乘积
  • 3 的幂
  • 反转字符串
  • 两个数组的交集
  • 有效的完全平方数
  • 两整数之和
  • 组合总和 Ⅳ
  • 赎金信
  • 整数替换
  • 第 N 位数字
  • Fizz Buzz
  • 第三大的数
  • 从英文中重建数字
  • N 叉树的层序遍历
  • 字符串中的单词数
  • 路径总和 III
  • 排列硬币
  • 数组中重复的数据
  • 回旋镖的数量
  • 递增子序列
  • 下一个更大元素 II
  • 完美数
  • 斐波那契数
  • 学生出勤记录 I
  • 反转字符串中的单词 III
  • N 叉树的最大深度
  • 和为 K 的子数组
  • 分糖果
  • 最长和谐子序列
  • 根据二叉树创建字符串
  • 合并二叉树
  • 只有两个键的键盘
  • 有效的括号字符串
  • 二叉搜索树中的搜索
  • 二分查找
  • 分隔链表
  • 宝石与石头
  • 链表的中间结点
  • 救生艇
  • 验证栈序列
  • 最长公共子序列
  • 最长定差子序列
  • 分割平衡字符串
  • 将二叉搜索树变平衡
  • 连续字符
  • 一维数组的动态和
  • 换酒问题
  • 所有奇数长度子数组的和
  • 分式化简
  • 数组中重复的数字
  • 替换空格
  • 从尾到头打印链表
  • 用两个栈实现队列
  • 斐波那契数列
  • 青蛙跳台阶问题
  • 数值的整数次方
  • 打印从1到最大的n位数
  • 删除链表的节点
  • 调整数组顺序使奇数位于偶数前面
  • 合并两个排序的链表
  • 二叉树的镜像
  • 从上到下打印二叉树 II
  • 从上到下打印二叉树 III
  • 二叉搜索树的后序遍历序列
  • 二叉树中和为某一值的路径
  • 字符串的排列
  • 二叉搜索树的第k大节点
  • 二叉搜索树的最近公共祖先
  • 二叉树的最近公共祖先
  • 反转链表
  • 山峰数组的顶部
  • 最小路径之和
  • 返回倒数第 k 个节点
  • 链表求和
  • 检查平衡性
  • 最小K个数
  • 从上到下打印二叉树
  • 第一个只出现一次的字符
  • 字符串相加
  • 算法
guoguoqiqi
2022-03-08

解数独

编写一个程序,通过填充空格来解决数独问题。

数独的解法需 遵循如下规则:

  1. 数字 1-9 在每一行只能出现一次。
  2. 数字 1-9 在每一列只能出现一次。
  3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)

数独部分空格内已填入了数字,空白格用 '.' 表示。

示例:

image

输入:board = [
  ["5","3",".",".","7",".",".",".","."],
  ["6",".",".","1","9","5",".",".","."],
  [".","9","8",".",".",".",".","6","."],
  ["8",".",".",".","6",".",".",".","3"],
  ["4",".",".","8",".","3",".",".","1"],
  ["7",".",".",".","2",".",".",".","6"],
  [".","6",".",".",".",".","2","8","."],
  [".",".",".","4","1","9",".",".","5"],
  [".",".",".",".","8",".",".","7","9"]]

输出:[
  ["5","3","4","6","7","8","9","1","2"],
  ["6","7","2","1","9","5","3","4","8"],
  ["1","9","8","3","4","2","5","6","7"],
  ["8","5","9","7","6","1","4","2","3"],
  ["4","2","6","8","5","3","7","9","1"],
  ["7","1","3","9","2","4","8","5","6"],
  ["9","6","1","5","3","7","2","8","4"],
  ["2","8","7","4","1","9","6","3","5"],
  ["3","4","5","2","8","6","1","7","9"]]

解释:输入的数独如上图所示,唯一有效的解决方案如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

image

/**
 * @param {character[][]} board
 * @return {void} Do not return anything, modify board in-place instead.
 */
var solveSudoku = function(board) {
  const rows = new Array(9);    // 存放每一行对应的可选数集
  const cols = new Array(9);    // 存放每一列对应的可选数集
  const blocks = new Array(9);  // 存放每一框对应的可选数集
  const options = ['1', '2', '3', '4', '5', '6', '7', '8', '9']; 
  for (let i = 0; i < 9; i++) { // 集合的初始化
    rows[i] = new Set(options);
    cols[i] = new Set(options);
    blocks[i] = new Set(options);
  }

  const getBlockIndex = (i, j) => { // 根据坐标,获取所在的小框的索引
    return (i / 3 | 0) * 3 + j / 3 | 0;  // |0 是向下取整
  };

  for (let i = 0; i < 9; i++) {    // 根据现有的已填的数字,更新set们
    for (let j = 0; j < 9; j++) {
      if (board[i][j] != ".") {
        rows[i].delete(board[i][j]); // 当前行出现过这个数字,这个数字就不能在这一行出现,删除该选项
        cols[j].delete(board[i][j]);
        blocks[getBlockIndex(i, j)].delete(board[i][j]);
      }
    }
  }

  const fill = (i, j) => {
    if (j == 9) {     // 列越界,就填下一行
      i++;
      j = 0;
      if (i == 9) return true;  // 都填完了 返回true
    }
    if (board[i][j] != ".") return fill(i, j + 1); // 如果不是空白格,递归填下一格

    const blockIndex = getBlockIndex(i, j); // 获取所在小框的索引

    for (let num = 1; num <= 9; num++) {    // 枚举出所有选择:1-9
      const s = String(num);
      // 当前选择必须在三个set中都存在,如果有一个不存在,就说明发生了冲突,跳过该选择
      if (!rows[i].has(s) || !cols[j].has(s) || !blocks[blockIndex].has(s)) continue;

      board[i][j] = s;    // 作出选择
      rows[i].delete(s);  // 更新set们,删掉这个可填选项
      cols[j].delete(s);
      blocks[blockIndex].delete(s);

      if (fill(i, j + 1)) return true; // 如果基于当前选择,填下一个,最后可解出数独,直接返回真
      // 基于当前选择,填下一个,怎么填都不行,回溯,恢复为空白格
      board[i][j] = ".";
      rows[i].add(s);     // set们,将之前删掉的当前数字,加回来
      cols[j].add(s);
      blocks[blockIndex].add(s);
    }
    return false;  // 尝试了1-9,每个都往下递归,都不能做完,返回false
  };

  fill(0, 0);  // 填格子的起点
  return board;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/sudoku-solver

← 有效的数独 外观数列→

最近更新
01
vuex数据持久化怎么做
05-22
02
vue的动态路由怎么配置使用
05-22
03
vue权限控制一般怎么做
05-22
更多文章>
Theme by Vdoing | Copyright © 2022-2022 Guoquoqiqi | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式