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

带有后台的网站开发软件大作设计网站

带有后台的网站开发软件,大作设计网站,广东省住房和城乡建设厅官网,北京手机网站建设请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 注…

请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。

  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"]]
输出:true

示例 2:

输入: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
解释:除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。 但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。

提示:

  • board.length == 9
  • board[i].length == 9
  • board[i][j] 是一位数字(1-9)或者 '.'
     

方法一:分别检查行、列和 3x3 宫格

此方法依次对每一行、每一列以及每一个 3x3 宫格进行检查,利用集合来记录已出现的数字,若发现重复数字则判定数独无效。

function isValidSudoku(board: string[][]): boolean {// 检查每一行for (let i = 0; i < 9; i++) {const rowSet = new Set<string>();for (let j = 0; j < 9; j++) {const cell = board[i][j];if (cell!== '.') {if (rowSet.has(cell)) {return false;}rowSet.add(cell);}}}// 检查每一列for (let j = 0; j < 9; j++) {const colSet = new Set<string>();for (let i = 0; i < 9; i++) {const cell = board[i][j];if (cell!== '.') {if (colSet.has(cell)) {return false;}colSet.add(cell);}}}// 检查每一个 3x3 宫格for (let i = 0; i < 9; i += 3) {for (let j = 0; j < 9; j += 3) {const boxSet = new Set<string>();for (let x = i; x < i + 3; x++) {for (let y = j; y < j + 3; y++) {const cell = board[x][y];if (cell!== '.') {if (boxSet.has(cell)) {return false;}boxSet.add(cell);}}}}}return true;
}
复杂度分析
  • 时间复杂度:(O(1)),由于数独的规模固定为 9x9,代码需遍历 81 个单元格,操作次数恒定。
  • 空间复杂度:(O(1)),在检查行、列和 3x3 宫格时,集合最多存储 9 个元素,属于常数级空间复杂度。

方法二:一次遍历检查

该方法在一次遍历数独的过程中,同时记录每一行、每一列以及每一个 3x3 宫格中数字的出现情况,使用三个二维数组来分别存储这些信息。

function isValidSudoku(board: string[][]): boolean {const rows: boolean[][] = Array.from({ length: 9 }, () => Array(9).fill(false));const cols: boolean[][] = Array.from({ length: 9 }, () => Array(9).fill(false));const boxes: boolean[][] = Array.from({ length: 9 }, () => Array(9).fill(false));for (let i = 0; i < 9; i++) {for (let j = 0; j < 9; j++) {const cell = board[i][j];if (cell!== '.') {const num = parseInt(cell) - 1;const boxIndex = Math.floor(i / 3) * 3 + Math.floor(j / 3);if (rows[i][num] || cols[j][num] || boxes[boxIndex][num]) {return false;}rows[i][num] = true;cols[j][num] = true;boxes[boxIndex][num] = true;}}}return true;
}
复杂度分析
  • 时间复杂度:(O(1)),同样因为数独大小固定,仅需遍历 81 个单元格。
  • 空间复杂度:(O(1)),使用的三个二维数组大小均为 9x9,是常数级的空间开销。

方法三:使用哈希表优化

通过使用哈希表来存储每一行、每一列和每一个 3x3 宫格中数字的出现次数,在遍历过程中更新哈希表并检查是否有重复数字。

function isValidSudoku(board: string[][]): boolean {const rows: Map<number, Set<string>> = new Map();const cols: Map<number, Set<string>> = new Map();const boxes: Map<number, Set<string>> = new Map();for (let i = 0; i < 9; i++) {rows.set(i, new Set());cols.set(i, new Set());boxes.set(i, new Set());}for (let i = 0; i < 9; i++) {for (let j = 0; j < 9; j++) {const cell = board[i][j];if (cell!== '.') {const boxIndex = Math.floor(i / 3) * 3 + Math.floor(j / 3);if (rows.get(i)!.has(cell) || cols.get(j)!.has(cell) || boxes.get(boxIndex)!.has(cell)) {return false;}rows.get(i)!.add(cell);cols.get(j)!.add(cell);boxes.get(boxIndex)!.add(cell);}}}return true;
}
复杂度分析
  • 时间复杂度:(O(1)),遍历 9x9 的数独网格,操作次数固定。
  • 空间复杂度:(O(1)),哈希表最多存储 9 行、9 列和 9 个 3x3 宫格的信息,每个集合最多存储 9 个元素,为常数级空间复杂度。

你可以使用以下代码测试上述函数:

const 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"]
];
console.log(isValidSudoku(board1));const 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"]
];
console.log(isValidSudoku(board2));

 

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

相关文章:

  • 网站建设项目步骤网站推广怎么做有效果
  • 杭州工业设计公司排名前十强seo顾问赚钱吗
  • 响应式网站建设公司‘渠道营销推广方案
  • 网站建设分为哪些方面国际时事新闻2022最新
  • 排版设计模板网站seo网络营销外包公司
  • 1688网站怎么做分销电商培训心得体会
  • 律师怎么做网站武汉外包seo公司
  • 礼县建设局网站百度seo网络营销书
  • 建设企业网站的哪家好百度外推代发排名
  • 平面设计相关的网站有哪些内容百度推广代理商利润
  • 攻略做的比较好的网站优化大师win10
  • 手机产品展示网站模板磁力蜘蛛种子搜索
  • 网站开发实战项目杭州网站优化公司哪家好
  • 合肥网站建设王道下拉強百度热门搜索排行榜
  • 俄罗斯网站模版电商沙盘seo裤子关键词
  • 郑佩佩 最新消息杭州最好的seo公司
  • 莱西建设局官方网站百度关键词优化软件
  • 专门做摩托车的网站常见的网络营销方法
  • wordpress 禁用修订汉川seo推广
  • 阿里能帮做网站吗今天重大新闻国内最新消息
  • 丰收路网站建设重庆网站建设技术外包
  • 如何做交互式网站查排名
  • 东莞九江网站制作平台怎么推广
  • 网站傻瓜式建设百度推广代理加盟
  • 做淘宝推广怎样网站合适bing搜索 国内版
  • 网站建设开发流程网络营销的模式有哪些
  • 计算机培训机构排名最新麒麟seo
  • 口碑最好的网站建设百度代理公司查询
  • 网站建设 上传和下载功能百度怎么推广自己的作品
  • 设计签名免费纯手工签名seo怎么做整站排名