判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
- 数字 1-9 在每一行只能出现一次。
- 数字 1-9 在每一列只能出现一次。
- 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
上图是一个部分填充的有效的数独。
数独部分空格内已填入了数字,空白格用 ‘.’ 表示。
说明:
- 一个有效的数独(部分已被填充)不一定是可解的。
- 只需要根据以上规则,验证已经填入的数字是否有效即可。
- 给定数独序列只包含数字 1-9 和字符 ‘.’ 。
- 给定数独永远是 9x9 形式的。
1、先来一个比较简单的写法,思路也比较简单:就是对每一行,每一列,每个宫格进行重复性的排查,但是时间复杂度比较大O[n^3]
def isValidSudoku(self, board):
"""
:type board: List[List[str]]
:rtype: bool
"""
for i in range(len(board)):
for j in range(len(board)):
if board[i][j] != '.':
#判断行重复性
for k in range(j+1,9):
print k,j
if board[i][j] == board[i][k]:
#print board[i][j],board[i][k]
return False
#判断列重复性
for h in range(i+1,9):
if board[i][j] == board[h][j]:
print 2
return False
a = board[i][j]
board[i][j] = '0'
for g in range(i/3*3,i/3*3+3):
for q in range(j/3*3,j/3*3+3):
if a == board[g][q]:
print 1
return False
return True
2、采用了计数器,减少一定的时间复杂度,然后判断那个key的是大于1了,如果有就是False,否则就是True
def isValidSudoku1(self, board):
for i in range(len(board)):
row={}
col= {}
box = {}
for j in range(len(board)):
if board[i][j] != '.':
#行判断
if board[i][j] in row:
row[board[i][j]] +=1
else:
row[board[i][j]] = 1
if row[board[i][j]] >1:
#print 'r',row[board[i][j]]
return False
if board[j][i] != '.':
#列判断
if board[j][i] in col:
col[board[j][i]] +=1
else:
col[board[j][i]] = 1
if col[board[j][i]]>1:
#print 'c',col[board[j][i]]
return False
#print i/3*3+j/3,i%3*3+j%3
if board[i/3*3+j/3][i%3*3+j%3] != '.':
if board[i/3*3+j/3][i%3*3+j%3] in box:
box[board[i/3*3+j/3][i%3*3+j%3]] += 1
else:
box[board[i/3*3+j/3][i%3*3+j%3]] = 1
if box[board[i/3*3+j/3][i%3*3+j%3]] >1:
return False
return True
应该还有更好的方法吧,但是我比较愚笨,没有想出来,如果有大佬知道的话,希望不吝赐教!