代码随想录刷题笔记-Day30

1.  解数独

37. 解数独icon-default.png?t=N7T8https://leetcode.cn/problems/sudoku-solver/

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

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

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

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

示例 1:

输入: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"]]
解释:输入的数独如上图所示,唯一有效的解决方案如下所示:

解题思路

这是一道hard。3个要求肯定需要三组标记进行if判断。而且很明显这是一道穷举的带回溯的题,需要使用到回溯算法,也就是深度优先。

这是一个固定9x9大小的框,为了满足三个要求,所以需要先构建三个标记set或者list。Set含有一个求交集的API,所以Set比较合适。所以有一个colSet[]记录每一列的可选元素,rowset[]记录每一行的可选元素,boxSet[]每一个框的可选元素。

每次都从交集里面取出一个数字,然后进入下一个迭代。当到达8,9的时候就结束。

思路有部分的bug:

当row为9的时候结束返回true。

代码 

class Solution {HashSet<Character>[] setCol = new HashSet[9];HashSet<Character>[] setRow = new HashSet[9];HashSet<Character>[] setBox = new HashSet[9];public void solveSudoku(char[][] board) {initializeSets(board);backTrack(board, 0, 0);}private void initializeSets(char[][] board) {HashSet<Character> full = new HashSet<>(Arrays.asList('1', '2', '3', '4', '5', '6', '7', '8', '9'));for (int i = 0; i < 9; i++) {setRow[i] = new HashSet<>(full);setCol[i] = new HashSet<>(full);setBox[i] = new HashSet<>(full);}for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {char num = board[i][j];if (num != '.') {setRow[i].remove(num);setCol[j].remove(num);setBox[i / 3 * 3 + j / 3].remove(num);}}}}private boolean backTrack(char[][] board, int i, int j) {if (i == 9)return true;if (j == 9)return backTrack(board, i + 1, 0);if (board[i][j] != '.') {return backTrack(board, i, j + 1);}HashSet<Character> set = new HashSet<>(setRow[i]);set.retainAll(setCol[j]);set.retainAll(setBox[i / 3 * 3 + j / 3]);for (char num : set) {board[i][j] = num;setRow[i].remove(num);setCol[j].remove(num);setBox[i / 3 * 3 + j / 3].remove(num);if (backTrack(board, i, j + 1)) {return true;}board[i][j] = '.';setRow[i].add(num);setCol[j].add(num);setBox[i / 3 * 3 + j / 3].add(num);}return false;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/723964.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打动HR的秘密武器:四款在线简历制作网站,让你脱颖而出!

如果你想找到一份好工作&#xff0c;你必须先写一份优秀的工作。在这个人力资源部承认一天要看数百份简历的时代&#xff0c;求职者需要一份优秀的简历才能脱颖而出&#xff0c;获得面试机会。 现实中&#xff0c;很多人往往无法设计出满意的简历&#xff0c;所以他们甚至没有…

人工智能-飞桨

文章目录 概要安装零基础教程基础知识小结 概要 集核心框架、基础模型库、端到端开发套件、丰富的工具组件于一体的深度学习平台 官方入口 安装 python安装 python官方下载 PaddlePaddle安装 python -m pip install paddlepaddle2.6.0 -i https://mirror.baidu.com/pypi/s…

上位机图像处理和嵌入式模块部署(qmacvisual三个特色)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 了解了qmacvisual的配置之后&#xff0c;正常来说&#xff0c;我们需要了解下不同插件的功能是什么。不过我们不用着急&#xff0c;可以继续学习下…

MySQL数据库技术(二)

MySQL数据库技术&#xff08;1X&#xff09; 定义表的时候&#xff0c;需要确定每个字段的数据类型。MySQL 支持多种数据类型&#xff0c; 大致可以分为三类&#xff1a;数值类型、日期/时间类型和字符串类型。 数值类型 数值类型包括 5 种整数、2 种浮点数和 1 种定点数&a…

Java 实现国网698协议,帧头、数据帧校验算法

最近在做电表测试相关软件&#xff0c;开发过程需要学习698协议&#xff0c;网上关于698协议的资料很少。此文记录一下协议中关于帧头和整帧校验码算法&#xff0c;Java代码如下&#xff1a; public class Test {public static void main(String[] args) {//定义一个字节数据用…

mac设置java环境变量

在 macOS 系统上&#xff0c;设置 JAVA_HOME 环境变量可以通过以下步骤进行&#xff1a; 打开终端应用程序。 输入以下命令来查找 Java 的安装路径&#xff1a;/usr/libexec/java_home 终端会返回 Java 的安装路径&#xff0c;类似 /Library/Java/JavaVirtualMachines/jdk1.…

跨境电商选品API商品采集API接入指南

选品是每个电商卖家的必经之路&#xff0c;产品的好坏将直接决定店铺的盈利、发展方向。选择合适的产品可以让卖家事半功倍&#xff0c;快速爆单。 用API实现代购系统和1688淘宝等平台的商品信息对接&#xff0c;可以免去很多选品工作。 item_get 获得淘宝商品详情item_get_p…

在vue3中使用el-tree-select做一个树形下拉选择器

el-tree-select是一个含有下拉菜单的树形选择器&#xff0c;结合了 el-tree 和 el-select 两个组件的功能。 因为包含了el-tree的功能&#xff0c;我们可以自定义tree的节点&#xff0c;创造出想要的组件 使用default插槽可以自定义节点内容&#xff0c;它的default插槽相当于…

Day19:信息打点-红蓝队自动化项目资产侦察武器库部署企查产权网络空间

目录 各类红蓝队优秀工具项目集合 自动化-武器库部署-F8x 自动化-网络空间-AsamF 自动化-企查信息-ENScan 自动化-综合架构-ARL&Nemo 思维导图 章节知识点 Web&#xff1a;语言/CMS/中间件/数据库/系统/WAF等 系统&#xff1a;操作系统/端口服务/网络环境/防火墙等 应…

高中数学:单调奇偶综合(较难)

一、奇偶性扩展 1、普通轴对称函数 要会根据抽象函数的关系&#xff0c;找出对称轴 简便记法&#xff1a;纵相等&#xff0c;对称轴 2、普通中心对称函数 要会找出对称中心点坐标 简便记法&#xff1a;纵和定&#xff0c;中心点 二、题型汇总 解题方法 抽象函数 1、…

如果不使用管理器,星露谷如何安装模组

Mac、Linux、安卓系统建议阅读官方WIKI 如果你没有特殊的需求&#xff0c;可以使用小火星露谷管理器一键安装模组 https://smallfire.cn 1. 什么是模组&#xff1f; 扩展或修改游戏的文件。可以改变游戏。功能如下&#xff1a; 扩展游戏内容&#xff0c;比如添加额外的游戏…

斐波那契数列js

斐波那契数列是一个经典的数学问题&#xff0c;它的定义是&#xff1a;第一个和第二个数都是1&#xff0c;从第三个数开始&#xff0c;每个数都是前两个数的和。斐波那契数列的前几个数字依次为&#xff1a;1, 1, 2, 3, 5, 8, 13, 21, … 在JavaScript中&#xff0c;可以使用递…

C++ 多态的概述

文章目录 1、概念2、引入3、使用基类指针、引用 访问 子类对象中的成员方法&#xff08;虚函数&#xff09;4、基类指针作为函数的参数 函数可以操作该基类派生出的任意子类对象 1、概念 多态是c的特征之一 多态的分类&#xff1a;静态多态&#xff08;静态联编&#xff09;、…

Android Studio开发(二) 常用布局

1、概述 在Android Studio中&#xff0c;布局方式指的是用于定义和排列界面元素&#xff08;如按钮、文本框、图片等&#xff09;的方式。Android应用的界面通常由多个视图组件组成&#xff0c;而布局方式则确定了这些视图组件在屏幕上的位置、大小和相互关系。 适应不同屏幕尺…

常用办公工具汇总

一、流程图类工具 1、xmind 2、draw.io

时钟显示 html JavaScript

sf.html <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>时间</title><script>function showTime(){var timenew Date();var datetime.getDate();var yeartime.getFullYear();var monthtime.getMonth()1;var …

Tailscale中继服务derper使用docker-compose部署

docker启动 docker run --restart always \--name derper -p 12345:12345 -p 3478:3478/udp \-v /root/.acme.sh/xxxx/:/app/certs \-e DERP_CERT_MODEmanual \-e DERP_ADDR12345 \-e DERP_DOMAINxxxx \-d ghcr.io/yangchuansheng/derper:latestdocker-compose启动 version: …

execl表格,检测单元格是否为有效的手机号码

IF函数&#xff0c;判断不满足条件&#xff0c;返回false。 AND(LEN(B2)11,IF(OR(MID(B2,2,1)"0",MID(B2,2,1)"1",MID(B2,2,1)"2",MID(B2,2,1)"4"),FALSE,TRUE),ISNUMBER(VALUE(B2)),LEFT(B2,1)"1") 备注&#xff1a;LEN函数…

vue3中的生命周期有哪些和怎么使用?

目录 前言&#xff1a; 正文&#xff1a; 总结: 前言&#xff1a; Vue.js 3是Vue.js框架的最新主要版本&#xff0c;引入了一些重大的改变和增强。在Vue 3中&#xff0c;由于Composition API的引入&#xff0c;生命周期钩子被替换为生命周期函数。 正文&#xff1a; 以下是…

如何系统的学习Python——类和对象

在Python中&#xff0c;类&#xff08;Class&#xff09;和对象&#xff08;Object&#xff09;是面向对象编程&#xff08;OOP&#xff09;的核心概念。 类&#xff08;Class&#xff09;&#xff1a; 定义&#xff1a; 类是一种抽象的数据类型&#xff0c;它定义了一组属性…