当前位置: 首页 > wzjs >正文

网站推广平台代理全国各城市疫情高峰感染高峰进度

网站推广平台代理,全国各城市疫情高峰感染高峰进度,开源网站模板cms,厦门seo网络优化公司一、问题剖析 在算法领域中,数独问题是一个经典且有趣的逻辑验证题目。本题的核心任务是判断一个给定的 9x9 数独是否有效。判断的依据是数独的基本规则:数字 1-9 在每一行、每一列以及每一个 3x3 的宫内都只能出现一次。同时,题目中明确指出…

一、问题剖析

在算法领域中,数独问题是一个经典且有趣的逻辑验证题目。本题的核心任务是判断一个给定的 9x9 数独是否有效。判断的依据是数独的基本规则:数字 1-9 在每一行、每一列以及每一个 3x3 的宫内都只能出现一次。同时,题目中明确指出,空白格用 '.' 表示,并且一个有效的数独(部分已被填充)不一定是可解的,我们只需验证已填入数字的有效性即可。

二、解题思路

  1. 行的验证:遍历数独的每一行,使用一个布尔数组来记录数字 1-9 是否出现过。在遍历每一行的过程中,对于每个数字,如果该数字已经在当前行出现过(即布尔数组对应位置为 true),则说明该行无效,直接返回 false;如果该数字为 '.',则跳过继续遍历;如果遍历完一行,没有出现重复数字,则该行有效。

  2. 列的验证:类似于行的验证,遍历数独的每一列。同样使用一个布尔数组来记录数字 1-9 是否出现过。在遍历每一列的过程中,对于每个数字,检查其是否已经在当前列出现过,若出现重复则返回 false;遇到 '.' 则跳过;遍历完一列没有重复数字则该列有效。

  3. 3x3 宫的验证:将数独划分为 9 个 3x3 的宫,遍历每个宫。对于每个宫,使用一个布尔数组来记录数字 1-9 是否出现过。通过计算每个宫的起始位置,然后遍历宫内的每个数字,检查是否出现重复,若出现重复则返回 false;遇到 '.' 则跳过;遍历完一个宫没有重复数字则该宫有效。

  4. 整体判断:当行、列、宫都验证通过后,说明这个数独是有效的,返回 true;只要有一个部分验证不通过,就返回 false。

三、Java 代码实现

​
public class ValidSudoku {public boolean isValidSudoku(char[][] board) {// 验证每一行for (int i = 0; i < 9; i++) {boolean[] row = new boolean[9];for (int j = 0; j < 9; j++) {if (board[i][j] != '.') {int num = board[i][j] - '1';if (row[num]) {return false;}row[num] = true;}}}// 验证每一列for (int j = 0; j < 9; j++) {boolean[] col = new boolean[9];for (int i = 0; i < 9; i++) {if (board[i][j] != '.') {int num = board[i][j] - '1';if (col[num]) {return false;}col[num] = true;}}}// 验证 3x3 宫for (int startRow = 0; startRow < 9; startRow += 3) {for (int startCol = 0; startCol < 9; startCol += 3) {boolean[] box = new boolean[9];for (int i = startRow; i < startRow + 3; i++) {for (int j = startCol; j < startCol + 3; j++) {if (board[i][j] != '.') {int num = board[i][j] - '1';if (box[num]) {return false;}box[num] = true;}}}}}return true;}
}​

四、代码详细解析

1、行的验证代码

// 验证每一行
for (int i = 0; i < 9; i++) {boolean[] row = new boolean[9];for (int j = 0; j < 9; j++) {if (board[i][j] != '.') {int num = board[i][j] - '1';if (row[num]) {return false;}row[num] = true;}}
}

外层循环 for (int i = 0; i < 9; i++) 遍历数独的每一行。每次进入循环,创建一个长度为 9 的布尔数组 row 用于记录当前行数字 1-9 的出现情况。内层循环 for (int j = 0; j < 9; j++) 遍历当前行的每一个数字。如果当前数字不是 '.',将其转换为数组索引(通过 board[i][j] - '1'),检查该索引对应的布尔值是否为 true,若为 true 则说明数字重复,返回 false;若为 false,则将其设置为 true 表示该数字已出现。

2、列的验证代码

// 验证每一列
for (int j = 0; j < 9; j++) {boolean[] col = new boolean[9];for (int i = 0; i < 9; i++) {if (board[i][j] != '.') {int num = board[i][j] - '1';if (col[num]) {return false;}col[num] = true;}}
}

外层循环 for (int j = 0; j < 9; j++) 遍历数独的每一列。每次进入循环,创建一个长度为 9 的布尔数组 col 用于记录当前列数字 1-9 的出现情况。内层循环 for (int i = 0; i < 9; i++) 遍历当前列的每一个数字。逻辑与行的验证类似,检查当前数字是否重复,若重复则返回 false。

3、3x3 宫的验证代码

// 验证 3x3 宫
for (int startRow = 0; startRow < 9; startRow += 3) {for (int startCol = 0; startCol < 9; startCol += 3) {boolean[] box = new boolean[9];for (int i = startRow; i < startRow + 3; i++) {for (int j = startCol; j < startCol + 3; j++) {if (board[i][j] != '.') {int num = board[i][j] - '1';if (box[num]) {return false;}box[num] = true;}}}}
}

外层的两个循环 for (int startRow = 0; startRow < 9; startRow += 3) 和 for (int startCol = 0; startCol < 9; startCol += 3) 用于遍历 9 个 3x3 的宫。每次进入循环,创建一个长度为 9 的布尔数组 box 用于记录当前宫数字 1-9 的出现情况。内层的两个循环 for (int i = startRow; i < startRow + 3; i++) 和 for (int j = startCol; j < startCol + 3; j++) 遍历当前宫的每一个数字,检查是否重复,若重复则返回 false。

4、最终返回结果

return true;

当行、列、宫都验证通过后,说明数独有效,返回 true。

五、复杂度分析

  1. 时间复杂度:整个算法需要遍历数独的每一行、每一列以及每一个 3x3 的宫。数独的大小为 9x9,对于行的验证,需要遍历 9 行,每行 9 个数字,时间复杂度为 (O(9times9));列的验证同理,时间复杂度也为 (O(9times9));3x3 宫的验证,需要遍历 9 个宫,每个宫有 9 个数字,时间复杂度为 (O(9times9))。所以总的时间复杂度为 (O(9times9 + 9times9 + 9times9) = O(243) = O(1)),因为 9 是固定的常数。

  2. 空间复杂度:在验证过程中,我们使用了布尔数组来记录数字的出现情况。对于每一行、每一列以及每一个 3x3 的宫,都创建了一个长度为 9 的布尔数组,总共需要的空间为 (9 + 9 + 9 = 27),也是一个固定的常数,所以空间复杂度为 (O(1))。

六、测试用例验证

1、测试用例 1

public class Main {public static void main(String[] args) {ValidSudoku solution = new ValidSudoku();char[][] board1 = {{'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'}};System.out.println(solution.isValidSudoku(board1)); // 输出: true}
}

2、测试用例 2

public class Main {public static void main(String[] args) {ValidSudoku solution = new ValidSudoku();char[][] board2 = {{'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'}};System.out.println(solution.isValidSudoku(board2)); // 输出: false}
}

感谢各位的阅读,后续将持续给大家讲解力扣中的算法题和数据库题,如果觉得这篇内容对你有帮助,别忘了点赞和关注,后续还有更多精彩的算法解析与你分享!

http://www.dtcms.com/wzjs/106108.html

相关文章:

  • ss网站模板免费下载佛山抖音seo
  • 西安做网站网络推广专员所需知识
  • 网站站外推广方式有哪些陕西seo快速排名
  • wordpress 美橙互联杭州seo搜索引擎优化
  • 响应式网站建设价位最近一周新闻大事件
  • 傻瓜式做网站正规网络推广服务
  • 漳州网站建设公司首选公司山西疫情最新情况
  • 网站建设电话营销百度的官方网站
  • 网站开发设计大概多少费用网络推广优化是干啥的
  • 潍坊网站建设500百度收录查询接口
  • 网站制作 苏州北京专门做seo
  • 网站风格代码怎么推广一个平台
  • eclipse 网站开发过程泉州seo外包
  • wordpress 标签前缀上海专业优化排名工具
  • 怎么做网站生意百度百度
  • 重庆哪里可以做公司网站山东网络推广优化排名
  • 市级档案网站建设情况分析做竞价推广大概多少钱
  • 深圳营销网站建设策划seo干什么
  • 图片类网站 怎么做优化淘宝网官方网站
  • wordpress环境包关键词seo排名怎么样
  • python做网站是不是特别慢网络推广平台有哪些
  • 中信建设有限责任公司 乔锋 电话杭州seo薪资水平
  • 免费做网站电话竞价托管推广多少钱
  • 柬埔寨做赌博网站推广公司好做吗
  • 孝感市门户网站管理中心海南百度首页广告
  • 网站制作北京广州网络推广培训
  • 深圳网站建设在哪里找同城引流用什么软件
  • 微信小程序视频网站开发教程百度热词
  • 林业厅网站建设招标aso推广公司
  • 佛山网站设计公司优化大师电视版