今日力扣打卡题比较复杂,写个总结回顾一下。首先题目如下
37. 解数独
编写一个程序,通过已填充的空格来解决数独问题。

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

数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
空白格用 ‘.’ 表示。


一个数独。


答案被标成红色。

Note:

给定的数独序列只包含数字 1-9 和字符 ‘.’ 。
你可以假设给定的数独只有唯一解。
给定数独永远是 9x9 形式的。

  • 思路
    最开始拿到题理解数独本身的定义需要了解,答案就是把空格都填满,然后行程一个二维数组,并且为一个数独,也是唯一的答案。前阵子刚好做过一个题目判断二维数组是否是数独,因此大体有一些思路,竟然要填充空格,那就必然需要尝试,我们可以发现每填充一个都必须满足当前二维数组是数独,如果不满足,就换数字进行尝试,如果全部尝试完了也不满足,那说明前一个空格填充的数字就不对,这里自然而然的想到了回溯。填充一个然后填充下一个又想到了递归,基本大体的思路就定下来了,那就是回溯+递归。
  • 代码
    /*** 核心思想就是递归+回溯,把问题拆解,每次只处理一个空格*/boolean find = false;public void solveSudoku(char[][] board) {int x = -1, y = -1; // 这是当前递归要处理的坐标置boolean findSpace = false;for (int i = 0;i < board.length;i ++) {for (int j = 0;j < board[0].length;j ++) {if (board[i][j] == '.') {x = i;y = j;findSpace = true;break;}}if (findSpace) break;}if (x == -1 && y == -1) {find = true;return ;  // 此处说明已经没有空格,找到了答案}for (int i = 1;i <= 9;i ++) {board[x][y] = (char) ('0' + i); // 给当前的这个空格赋值,可能的值来遍历if (isValidSudo(board)) { // 判断是否是合法的数独solveSudoku(board); // 继续递归if (find) return; // 找到答案,不再需要递归}}board[x][y] = '.'; // 回溯,当前任何值都无法组成答案}// 判断数独是否成立public boolean isValidSudo(char[][] board) {boolean[][] row = new boolean[9][9];boolean[][] list = new boolean[9][9];boolean[][] box = new boolean[9][9];for (int i = 0;i < board.length;i ++) {for (int j = 0;j < board[0].length;j ++) {if (board[i][j] == '.') continue;int num = board[i][j] - '1';int boxIndex = i / 3 * 3 + j / 3;if (row[i][num] || list[j][num] || box[boxIndex][num]) return false;row[i][num] = true;list[j][num] = true;box[boxIndex][num] = true;}}return true;}

这个题的考察点对于数独的理解,难点在于找出递归出入口、回溯、与对于数独的判断。

力扣今日打卡数独解答相关推荐

  1. 力扣(LeetCode)打卡刷题交流计划(长期维护)

    前言 忙忙活活暑期过去了一半,在即将升学的日子里,打算干点什么东西,由于实力以及经验的欠缺没有创群和大家讨论,但我更喜欢以更实在的方式--能作点什么--和大家一起从0打开力扣LeetCode, 对,没 ...

  2. leetcode力扣36.有效的数独

    判断一个 9x9 的数独是否有效.只需要根据以下规则,验证已经填入的数字是否有效即可. 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗实线分隔的 ...

  3. 力扣—— 36. 有效的数独/37. 解数独

    目录 有效的数独 解数独 有效的数独 class Solution10(object):def isValidSudoku(self, board):""":type b ...

  4. 力扣:914. 卡牌分组 题解(Java)

    题目地址:卡牌分组 题目描述: 给定一副牌,每张牌上都写着一个整数. 此时,你需要选定一个数字 X,使我们可以将整副牌按下述规则分成 1 组或更多组: 每组都有 X 张牌. 组内所有的牌上都写着相同的 ...

  5. 力扣 #36.有效的数独 JAVA实现

    36.有效的数独 题目:请你判断一个 9 x 9 的数独是否有效.只需要 根据以下规则 ,验证已经填入的数字是否有效即可. 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. ...

  6. 力扣--36有效的数独

    题目 python代码 将所给的二位数组按照行.列.块,分别存储到对应的列表中,只需要看该列表中的每个元素的长度是否等于去重以后的长度即可. def isValidSudoku(self,board) ...

  7. 力扣每日打卡8月24日打卡(459. 重复的子字符串,简单)

    a b c d a b c d a b c d 0 1 2 3 4 5 6 7 8 9 10 11 当循环到d时,i为3时,0与4对比,1与5对比,2与6对比,3与7对比 之后4与8对比,5与9对比, ...

  8. 力扣编程题-解法汇总

    一.力扣链接: 题库 - 力扣 (LeetCode) 全球极客挚爱的技术成长平台 备注:以后每个工作日从前往后刷一道题,然后再加一道每日新题.每天两道题. 二.模版: 标题: 力扣解法汇总5-正则表达 ...

  9. 力扣热门题目简单部分合集(共23道)

    文章目录 前言 1.两数之和(哈希表,双指针,数组) 2.有效的括号(栈,哈希表) 3.合并两个有序链表(递归,迭代) 4.最大子数组和(动态规划,分治,贪心) 5.爬楼梯(迭代,递归,动态规划,数学 ...

最新文章

  1. 邬贺铨:5G资费便宜10倍 WiFi覆盖更为重要
  2. 2019年5月12日-linux就该这么学-第6课
  3. 解决11g Rac实例状态为Stuck Archiver
  4. np.newaxis——np.ndarray增加维数
  5. 微软在Build 2019大会上发布Fluid Framework协作平台
  6. 逆向工程核心原理学习笔记(十):IA-32寄存器基本讲解
  7. UVA-1 #1. A + B Problem
  8. oracle 分页_80分页查询,不止写法
  9. Modbus节点地址规则
  10. 文件创建时间、访问时间、修改时间
  11. JS与Jquery学习笔记(一)
  12. linux pstree(process status tree) 命令详解
  13. matlab 峰值位置,在数据中查找峰值 - MATLAB Simulink - MathWorks 中国
  14. 大数据面试3分钟自我介绍_面试的时候,如何自我介绍?
  15. RAR压缩包有密码怎么办
  16. gitlab小记(一)
  17. C语言goto语句 做一个自动关机小程序 —— 给小伙伴来个“恶作剧”吧
  18. 7-1 sdust-Java-字符串集合求并集 (20 分)
  19. 为什么要采用技术外包
  20. ArcGIS Maps SDK for Unreal Engine通过UI方式显示地图教程

热门文章

  1. 前台js中图片picture设置
  2. Arduino用遥控器控制LED灯开关和亮度
  3. matlab滞环比较控制器,滞环比较跟踪控制技术
  4. 获取input内容并回填_Input选项框的回填与取值
  5. c语言中余数取整,C 逻辑运算, 移位运算 , 取整 , 取模(取余)
  6. 如何将GPU中list类型的数据转移到CPU
  7. SSM项目使用Mybatis通用mapper插件tk.mybatis的用法
  8. Android-S ANR
  9. 惊闻!同学被诈骗2万美金!骗子的良心不会痛吗?
  10. Fidder快速上手使用