【LeetCode】37.解数独
欢迎来到李耶的频道【LeetCode面试题】。解数独37.解数独题目编写一个程序通过填充空格来解决数独问题。数独的解法需遵循如下规则数字1-9在每一行只能出现一次。数字1-9在每一列只能出现一次。数字1-9在每一个以粗实线分隔的3x3宫内只能出现一次。空白格用.表示。输入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] ] 输出true输入board [ [8,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] ] 输出false提示board.length 9board[i].length 9board[i][j]是一位数字1-9或者.题目数据保证输入数独仅有一个解解法一回溯法DFS⭐思路采用深度优先搜索策略逐个处理空白格。对于每个空白格尝试填入数字1-9并通过辅助函数检查填入是否合法所在行、列、3x3宫格内无重复。如果合法则递归处理下一个空白格若后续填数无解则回溯撤销当前填入的数字尝试下一个数字。3x3宫格索引计算boxIndex Math.floor(i / 3) * 3 Math.floor(j / 3)。functionsolveSudoku(board){constrowsnewArray(9).fill().map(()newArray(10).fill(false));constcolsnewArray(9).fill().map(()newArray(10).fill(false));constboxesnewArray(9).fill().map(()newArray(10).fill(false));constspaces[];// 1. 初始化记录已有数字收集空位for(leti0;i9;i){for(letj0;j9;j){constcharboard[i][j];if(char.){spaces.push([i,j]);}else{constnumNumber(char);constboxIndexMath.floor(i/3)*3Math.floor(j/3);rows[i][num]true;cols[j][num]true;boxes[boxIndex][num]true;}}}// 2. 回溯填充functiondfs(index){// 所有空位都填满了说明找到了一个可行解if(indexspaces.length){returntrue;}const[i,j]spaces[index];constboxIndexMath.floor(i/3)*3Math.floor(j/3);for(letnum1;num9;num){if(!rows[i][num]!cols[j][num]!boxes[boxIndex][num]){// 尝试填入数字rows[i][num]true;cols[j][num]true;boxes[boxIndex][num]true;board[i][j]String(num);// 递归处理下一个空位if(dfs(index1)){returntrue;}// 回溯撤销填入的数字rows[i][num]false;cols[j][num]false;boxes[boxIndex][num]false;board[i][j].;}}returnfalse;// 1-9 都试过了无解触发回溯}dfs(0);}时间复杂度 / 空间复杂度O(9^m) / O(9^2)其中 m 为空位数量最大 81。回溯算法本质是暴力搜索最坏情况下需要探索 9^m 种可能但由于数独约束强实际效率远高于理论值。空间主要用于递归调用栈和三个布尔数组。优势采用经典的 DFS 回溯框架并使用高效的布尔数组进行行-列-宫三重校验是面试中最推荐的写法。解法二行优先顺序枚举思路不预先收集空位而是从(0,0)开始按行优先顺序遍历整个棋盘。遇到空位则尝试填入数字并递归已填数字则跳过。这种方式与解法一本质相同只是实现细节略有差异。functionsolveSudoku(board){functionisValid(row,col,num){constnumStrString(num);constboxRowStartMath.floor(row/3)*3;constboxColStartMath.floor(col/3)*3;for(leti0;i9;i){if(board[row][i]numStr)returnfalse;if(board[i][col]numStr)returnfalse;}for(letiboxRowStart;iboxRowStart3;i){for(letjboxColStart;jboxColStart3;j){if(board[i][j]numStr)returnfalse;}}returntrue;}functiondfs(){for(leti0;i9;i){for(letj0;j9;j){if(board[i][j].){for(letnum1;num9;num){if(isValid(i,j,num)){board[i][j]String(num);if(dfs())returntrue;board[i][j].;}}returnfalse;}}}returntrue;}dfs();}时间复杂度 / 空间复杂度O(9^m) / O(9^2)优势isValid函数直接对board检查逻辑非常直观劣势每次检查都需要扫描行、列、宫效率低于解法一的布尔数组建议面试中使用解法一解法对比解法核心机制优势推荐指数回溯法预处理空位 布尔数组DFS 三重状态数组校验高效状态管理清晰⭐⭐⭐⭐⭐回溯法行优先顺序枚举DFS 实时校验代码结构非常直观⭐⭐⭐⭐扩展题有效的数独判断一个9x9数独是否有效无需解决它。N 皇后问题经典的 N 皇后问题其解题思路回溯 剪枝与解数独高度相似。“锲而不舍金石可镂。” —— 荀子《劝学》关注李耶每天一道面试题一起卷起来

相关新闻

企业自动化运营-电子合同预览-东方仙盟

企业自动化运营-电子合同预览-东方仙盟

代码<!DOCTYPE html> <html> <head><meta charset"utf-8"/><title>&#xff5c;软件服务协议电子确认单</title><meta name"viewport" content"initial-scale1, widthdevice-width, maximum-scale1, user-sca…

2026/11/2 13:57:00 阅读更多 →
从模拟世界到数字王国:单片机 ADC 完全指南

从模拟世界到数字王国:单片机 ADC 完全指南

一、ADC 的基本作用单片机的核心是数字电路&#xff0c;只能处理“0”和“1”。但现实中的物理量——比如温度、压力、电池电压、声音、光照强度——大多是连续变化的模拟量。传感器通常把这些物理量转换成电压信号&#xff0c;然后 ADC 再把电压转换成数字。举例&#xff1a; …

2026/11/2 7:56:22 阅读更多 →
107-llama.cpp-CPU跑7B模型-GGUF加载-GPU-offload

107-llama.cpp-CPU跑7B模型-GGUF加载-GPU-offload

文章目录【107.PythonAI】llama.cpp&#xff1a;在CPU上跑7B模型&#xff0c;不需要显卡也能玩大模型导入语1 ~> llama.cpp 凭什么能在CPU上跑2 ~> 编译安装与首次推理2.1 三行命令编译2.2 加载模型跑起来3 ~> 速度调优&#xff1a;把CPU榨干3.1 线程数的反直觉结论3.…

2026/11/3 16:15:29 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年&#xff0c;我大部分时间都在跟浏览器标签页打交道&#xff0c;直到第一次把桌面应用跑起来&#xff0c;才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词&#xff0c;最开始是在某段时间频繁出现在同事的讨论里&#xff0c;一个用HTML…

2026/11/4 1:35:24 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介&#xff1a;亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档&#xff0c;主要面向智能锁安装人员、终端用户及售后维护者&#xff0c;帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件&#xff0c;大小4.37MB&#xff0c;内容结构清晰&#xff…

2026/11/5 1:08:50 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统&#xff0c;整车要求空载跑到8m/s&#xff0c;电机转速已经拉到额定点&#xff0c;驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令&#xff0c;转速纹丝不动&#xff0c;三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/3 11:35:49 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年&#xff0c;用它写过嵌入式驱动、做过游戏服务端&#xff0c;也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词&#xff0c;我其实挺感慨的——这门语言的难点从来不是语法多&#xff0c;而是知识点之间的耦合太深…

2026/11/4 6:23:50 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介&#xff1a;亚太天能T109滑盖智能锁产品说明书以PDF格式发布&#xff0c;适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开&#xff0c;先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能&#xff0c;再给出完整安装步骤&…

2026/11/5 0:54:28 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历&#xff1a;翻开源码注释、论文摘要或者一份专业报告&#xff0c;每个字都认识&#xff0c;连在一起却像天书。想找人聊聊&#xff0c;身边要么没人懂&#xff0c;要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型&#xff0c;几秒钟之后&a…

2026/11/4 19:19:54 阅读更多 →

日新闻

周新闻

月新闻