原题
https://leetcode.cn/problems/valid-sudoku/description/
思路
遍历 + 集合
复杂度
时间:O(n)
空间:O(1)
Python代码
class Solution:
def isValidSudoku(self, board: List[List[str]]) -> bool:
for i in range(9):
# 数字 1-9 在每一行只能出现一次
row = [board[i][j] for j in range(9) if board[i][j] != '.']
if len(set(row)) < len(row):
return False
# 数字 1-9 在每一列只能出现一次
col = [board[j][i] for j in range(9) if board[j][i] != '.']
if len(set(col)) < len(col):
return False
for i in range(0, 9, 3):
for j in range(0, 9, 3):
# 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次
l = [board[i+x][j+y] for x in range(3) for y in range(3) if board[i+x][j+y] != '.']
if len(set(l)) < len(l):
return False
return True
Go代码
func isValidSudoku(board [][]byte) bool {
for i := 0; i < 9; i++ {
// 数字 1-9 在每一行只能出现一次
row := map[byte]bool{}
for j := 0; j < 9; j++ {
if board[i][j] != '.' {
// 出现重复值
if row[board[i][j]] {
return false
} else {
row[board[i][j]] = true
}
}
}
// 数字 1-9 在每一列只能出现一次
col := map[byte]bool{}
for j := 0; j < 9; j++ {
if board[j][i] != '.' {
// 出现重复值
if col[board[j][i]] {
return false
} else {
col[board[j][i]] = true
}
}
}
}
for i := 0; i < 9; i = i + 3 {
for j := 0; j < 9; j = j + 3 {
// 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次
sub := map[byte]bool{}
for x := 0; x < 3; x++ {
for y := 0; y < 3; y++ {
if board[i+x][j+y] != '.' {
if sub[board[i+x][j+y]] {
return false
} else {
sub[board[i+x][j+y]] = true
}
}
}
}
}
}
return true
}
有效数独算法实现
295

被折叠的 条评论
为什么被折叠?



