算法练习第五天——有效数独

简介: 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)

算法练习第五天——有效数独


法练习第五天——有效数独


有效数独题目


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


数字 1-9 在每一行只能出现一次。


数字 1-9 在每一列只能出现一次。


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


注意:


一个有效的数独(部分已被填充)不一定是可解的。


只需要根据以上规则,验证已经填入的数字是否有效即可。


空白格用 '.' 表示。


示例:

1.png

输入:shudu =


[[".","6","1",".","3",".",".","2","."]

,[".","5",".",".",".","8","1",".","7"]

,[".",".",".",".",".","7",".","3","4"]

,[".",".","9",".",".","6",".","7","8"]

,[".",".","3","2",".","9","5",".","."]

,["5","7",".","3",".",".","9",".","."]

,["1","9",".","7",".",".",".",".","."]

,["8",".","2","4",".",".",".","6","."]

,[".","4",".",".","1",".","2","5","."]]


输出:true


解题思路


这道题其实就是让我们判断行、列、九宫格内是否存在重复的元素,如果存在返回False,否则返回True

我们可以分别维护行、列、九宫格三个哈希表,然后每次判断是否存在即可。


这里唯一需要思考的是,如果判断当前的单元格,在哪个九宫格中,简单推倒下就能得出:  x // 3 * 3 + y // 3


方法一:遍历


以下代码以golang为例:

func isyouxiaoshudu(board [][]byte) bool {
    var rows, columns [9][9]int
    var subboxes [3][3][9]int
    for i, row := range board {
        for j, c := range row {
            if c == '.' {
                continue
            }
            index := c - '1'
            rows[i][index]++
            columns[j][index]++
            subboxes[i/3][j/3][index]++
            if rows[i][index] > 1 || columns[j][index] > 1 || subboxes[i/3][j/3][index] > 1 {
                return false
            }
        }
    }
    return true
}

改解法复杂度分析


时间复杂度:O(1)。数独共有 81 个单元格,只需要对每个单元格遍历一次即可。


空间复杂度:O(1)。由于数独的大小固定,因此哈希表的空间也是固定的。

相关文章
|
4月前
|
存储 算法 索引
模拟算法题练习(二)(DNA序列修正、无尽的石头)
模拟算法题练习(二)(DNA序列修正、无尽的石头)
|
4月前
|
并行计算 算法 测试技术
模拟算法题练习(一)(扫雷,灌溉,回文日期)
模拟算法题练习(一)(扫雷,灌溉,回文日期)
算法练习Day55|● 392.判断子序列 ● 115.不同的子序列
算法练习Day55|● 392.判断子序列 ● 115.不同的子序列
|
3月前
|
算法
【经典LeetCode算法题目专栏分类】【第3期】回溯问题系列:单词搜索、N皇后问题、判断有效数独、解数独
【经典LeetCode算法题目专栏分类】【第3期】回溯问题系列:单词搜索、N皇后问题、判断有效数独、解数独
|
4月前
|
算法 图形学
【头歌 计算机图形学 练习】多边形填充v1.0 (第1关:扫描线填充算法(活动边表AET法) 第2关:边缘填充法 第3关:区域四连通种子填充算法 第4关:区域扫描线种子填充算法)
【头歌 计算机图形学 练习】多边形填充v1.0 (第1关:扫描线填充算法(活动边表AET法) 第2关:边缘填充法 第3关:区域四连通种子填充算法 第4关:区域扫描线种子填充算法)
278 0
|
算法 前端开发
算法练习--深拷贝与浅拷贝
深拷贝与浅拷贝
68 0
|
4月前
|
存储 算法 搜索推荐
Leetcode算法题练习(一)
Leetcode算法题练习(一)
74 0
|
算法 Java
Java之包装类的算法小题的练习
Java之包装类的算法小题的练习
65 0