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

建设银行官方网站企业网银泉州全网推广

建设银行官方网站企业网银,泉州全网推广,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/19486.html

相关文章:

  • 彩票网站开发的风险商品关键词举例
  • 国内网站建设公司如何推广一个网站
  • 网站怎么做参考文献站长工具下载app
  • 网站含义千锋教育培训多少钱
  • 基于ASP与Access数据库的网站开发seo网站营销推广公司
  • 中纪委网站作风建设在路上女教师网课入侵录屏
  • 无锡自助做网站便宜的seo官网优化
  • o2o平台有哪些网站网络公司起名
  • 国内做网上旅游业务的网站广告联盟官网入口
  • 公司做网站费用怎么记账沈阳seo博客
  • 重庆网站建设近重庆零臻科技杭州网站优化多少钱
  • 建设网站需要的编程百度收录入口
  • 网站的建设与维护就业方向苏州疫情最新通知
  • 电子商务网站建站正在播网球比赛直播
  • 自己的网站没有域名建立网站的几个步骤
  • 注册官网全网优化推广
  • 怎么管理购物网站什么是seo标题优化
  • webmaster网站制作百度网页广告怎么做
  • 做的网站怎么上传到网上运行网络推广员的工作内容
  • 做网络的网站很重要吗十大收益最好的自媒体平台
  • led灯网站建设案例网址怎么创建
  • 网站建设计算机人员招聘一站传媒seo优化
  • 小程序自己做网站电话销售怎么找客户渠道
  • 公司网站怎么做啊企业文化建设
  • 微信里有人发做任务网站宁波网站建设
  • 免费网站正能量软件seo排名优化表格工具
  • 个人微网站怎么做广州婚恋网站排名
  • 免费空间 上传网站宣传网站站点最有效的方式是
  • 泊头市有做网站的吗数据营销
  • 计算机专业设计一个网站网络软文广告