题目:两数之和
描述:
判断一个数独是否有效,根据:Sudoku Puzzles - The Rules。 (数独规则: 每一行不能有重复的数字;每一列不能有重复的数字;将数独框划分为三行三列,没9个小方格不能有重复;)
数独部分填了数字,空的部分用 '.'
表示。
image
一个部分填充是有效的数独。
说明: 一个有效的数独(填了一部分的)不一定是可解的,只要已经填的数字是有效的即可。
思路: 根据题意及数独的规则,只需要判断每一行的数字,每一列的数字和9宫格的数字有没有重复即可。可以用Set进行解题。board[i][j]表示行,board[j][i]表示列,当i 和 j 对 3 进行求余为0时,表示一个9宫格。
代码如下:
代码语言:javascript复制class Solution {
//有效的数独
func isValidSudoku(_ board: [[Character]]) -> Bool {
var rowSet = Set<Character>()
var colSet = Set<Character>()
for i in 0..<9 {
rowSet.removeAll()
colSet.removeAll()
for j in 0..<9 {
if i % 3 == 0 && j % 3 == 0 {
//检查块
if !checkBlock(board, row: i, col: j) {
return false
}
}
if board[i][j] != "." {
//检查行
if rowSet.contains(board[i][j]) {
return false
}
rowSet.insert(board[i][j])
}
if board[j][i] != "." {
//检查列
if colSet.contains(board[j][i]) {
return false
}
colSet.insert(board[j][I])
}
}
}
return true
}
//检查块是否有效
private func checkBlock(_ board: [[Character]], row: Int, col: Int) -> Bool {
var blockSet = Set<Character>()
for i in row..<(row 3) {
for j in col..<(col 3) {
if board[i][j] != "." {
if blockSet.contains(board[i][j]) {
return false
}
blockSet.insert(board[i][j])
}
}
}
return true
}
}