【Leecode】Leecode刷题之路第37天之解数独

ops/2024/11/1 23:42:43/

题目出处

37-解数独-题目出处

题目描述

在这里插入图片描述在这里插入图片描述在这里插入图片描述

个人解法

思路:

java">todo

代码示例:(Java)

java">todo

复杂度分析

java">todo

官方解法

37-解数独-官方解法

在这里插入图片描述

方法1:回溯

思路:

在这里插入图片描述

代码示例:(Java)

java">public class Solution1 {private boolean[][] line = new boolean[9][9];private boolean[][] column = new boolean[9][9];private boolean[][][] block = new boolean[3][3][9];private boolean valid = false;private List<int[]> spaces = new ArrayList<int[]>();public void solveSudoku(char[][] board) {for (int i = 0; i < 9; ++i) {for (int j = 0; j < 9; ++j) {if (board[i][j] == '.') {spaces.add(new int[]{i, j});} else {int digit = board[i][j] - '0' - 1;line[i][digit] = column[j][digit] = block[i / 3][j / 3][digit] = true;}}}dfs(board, 0);}public void dfs(char[][] board, int pos) {if (pos == spaces.size()) {valid = true;return;}int[] space = spaces.get(pos);int i = space[0], j = space[1];for (int digit = 0; digit < 9 && !valid; ++digit) {if (!line[i][digit] && !column[j][digit] && !block[i / 3][j / 3][digit]) {line[i][digit] = column[j][digit] = block[i / 3][j / 3][digit] = true;board[i][j] = (char) (digit + '0' + 1);dfs(board, pos + 1);line[i][digit] = column[j][digit] = block[i / 3][j / 3][digit] = false;}}}}

复杂度分析

  • 时间复杂度:O(1)。数独共有 81 个单元格,只需要对每个单元格遍历一次即可。
  • 空间复杂度:O(1)。由于数独的大小固定,因此哈希表的空间也是固定的。

方法2:位运算优化

思路:

在这里插入图片描述

代码示例:(Java)

java">public class Solution2 {private int[] line = new int[9];private int[] column = new int[9];private int[][] block = new int[3][3];private boolean valid = false;private List<int[]> spaces = new ArrayList<int[]>();public void solveSudoku(char[][] board) {for (int i = 0; i < 9; ++i) {for (int j = 0; j < 9; ++j) {if (board[i][j] == '.') {spaces.add(new int[]{i, j});} else {int digit = board[i][j] - '0' - 1;flip(i, j, digit);}}}dfs(board, 0);}public void dfs(char[][] board, int pos) {if (pos == spaces.size()) {valid = true;return;}int[] space = spaces.get(pos);int i = space[0], j = space[1];int mask = ~(line[i] | column[j] | block[i / 3][j / 3]) & 0x1ff;for (; mask != 0 && !valid; mask &= (mask - 1)) {int digitMask = mask & (-mask);int digit = Integer.bitCount(digitMask - 1);flip(i, j, digit);board[i][j] = (char) (digit + '0' + 1);dfs(board, pos + 1);flip(i, j, digit);}}public void flip(int i, int j, int digit) {line[i] ^= (1 << digit);column[j] ^= (1 << digit);block[i / 3][j / 3] ^= (1 << digit);}}

复杂度分析

  • 时间复杂度:O(1)。数独共有 81 个单元格,只需要对每个单元格遍历一次即可。
  • 空间复杂度:O(1)。由于数独的大小固定,因此哈希表的空间也是固定的。

方法3:枚举优化

思路:

在这里插入图片描述

代码示例:(Java)

java">public class Solution3 {private int[] line = new int[9];private int[] column = new int[9];private int[][] block = new int[3][3];private boolean valid = false;private List<int[]> spaces = new ArrayList<int[]>();public void solveSudoku(char[][] board) {for (int i = 0; i < 9; ++i) {for (int j = 0; j < 9; ++j) {if (board[i][j] != '.') {int digit = board[i][j] - '0' - 1;flip(i, j, digit);}}}while (true) {boolean modified = false;for (int i = 0; i < 9; ++i) {for (int j = 0; j < 9; ++j) {if (board[i][j] == '.') {int mask = ~(line[i] | column[j] | block[i / 3][j / 3]) & 0x1ff;if ((mask & (mask - 1)) == 0) {int digit = Integer.bitCount(mask - 1);flip(i, j, digit);board[i][j] = (char) (digit + '0' + 1);modified = true;}}}}if (!modified) {break;}}for (int i = 0; i < 9; ++i) {for (int j = 0; j < 9; ++j) {if (board[i][j] == '.') {spaces.add(new int[]{i, j});}}}dfs(board, 0);}public void dfs(char[][] board, int pos) {if (pos == spaces.size()) {valid = true;return;}int[] space = spaces.get(pos);int i = space[0], j = space[1];int mask = ~(line[i] | column[j] | block[i / 3][j / 3]) & 0x1ff;for (; mask != 0 && !valid; mask &= (mask - 1)) {int digitMask = mask & (-mask);int digit = Integer.bitCount(digitMask - 1);flip(i, j, digit);board[i][j] = (char) (digit + '0' + 1);dfs(board, pos + 1);flip(i, j, digit);}}public void flip(int i, int j, int digit) {line[i] ^= (1 << digit);column[j] ^= (1 << digit);block[i / 3][j / 3] ^= (1 << digit);}}

复杂度分析

  • 时间复杂度:O(1)。数独共有 81 个单元格,只需要对每个单元格遍历一次即可。
  • 空间复杂度:O(1)。由于数独的大小固定,因此哈希表的空间也是固定的。

考察知识点

收获

1.位运算

Gitee源码位置

37-解数独-源码

同名文章,已同步发表于CSDN,个人网站,公众号

  • CSDN

    工一木子
  • 个人网站

    工藤新一
  • 公众号

    在这里插入图片描述

http://www.ppmy.cn/ops/130263.html

相关文章

达梦数据迁移工具DTS使用实践

1、环境描述 2、DTS概述 1.支持视图、存储过程/函数、包、类、同义词、触发器等对象迁移&#xff1b; 2.支持数据类型的自动映射&#xff0c;编码转换&#xff1b; 3.支持根据条件自定义迁移部分数据&#xff1b; 4.向导式迁移步骤&#xff0c;上手简单&#xff1b; 5.支持 we…

大数据新视界 -- 大数据大厂都在用的数据目录管理秘籍大揭秘,附海量代码和案例

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

乐鑫ESP32-S3无线AI语音方案,教育机器人交互应用,启明云端乐鑫代理商

随着科技的飞速发展&#xff0c;尤其是人工智能和物联网技术的不断进步&#xff0c;教育方式和学习工具正在被重新定义。 教育机器人以其独特的互动性和智能化特点&#xff0c;为学生提供了一个全新的学习平台。这些机器人能够通过语音识别、图像处理和自然语言处理等技术&…

什么是AI神经网络?

文章目录 神经网络的基本概念如何工作&#xff1f;训练过程应用实例未来展望推荐阅读文章 在当今的科技时代&#xff0c;人工智能&#xff08;AI&#xff09;已经深入到我们生活的各个方面&#xff0c;而神经网络则是推动这一发展的重要技术之一。无论是在图像识别、自然语言处…

git入门教程6:git基本版本控制

一、初始化和配置Git仓库 安装Git&#xff1a; 首先&#xff0c;从Git的官方网站&#xff08;git-scm.com&#xff09;下载并安装Git。安装过程中按照提示操作即可。 初始化仓库&#xff1a; 打开终端或Git Bash&#xff0c;导航到你想要进行版本控制的项目目录。输入git init…

基于无框力矩电机抱闸实现人形机器人在展会中不依赖悬吊

目录&#xff1a; 1 人形机器人在展会中的悬吊状态 2 人形机器人不能长时间站立的原因 3 基于电机抱闸使人形机器长时间站立 4 人形机器人在实用场景中必须长时间站立、快速进行 “静-动” 互换 5 人形机器人在实用场景中实现 “静-动” 快速互换的抱闸控制思路 6 无框力…

【论文解读】Med-BERT: 用于疾病预测的大规模结构化电子健康记录的预训练情境化嵌入

【论文解读】Med-BERT: 用于疾病预测的大规模结构化电子健康记录的预训练情境化嵌入 Med-BERT:pretrained contextualized embeddings on large-scale structured electronic health records for disease prediction ​ ​ 摘要:基于电子健康记录(EHR)的深度学习(DL)预…

NLP算法工程师精进之路:顶会论文研读精华

1.学术能力培养 全部论文资料下载&#xff1a; 将论文和 GitHub 资源库匹配 papers with code https://paperswithcode.com/OpenGitHub 新项目快报Github pwc&#xff1a;https://github.com/zziz/pwc GitXiv&#xff1a;http://www.gitxiv.com/ 文章撰写 Overleaf [Autho…