判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
- 数字
1-9
在每一行只能出现一次。 - 数字
1-9
在每一列只能出现一次。 - 数字
1-9
在每一个以粗实线分隔的3x3
宫内只能出现一次。
上图是一个部分填充的有效的数独。
数独部分空格内已填入了数字,空白格用 '.'
表示。
方法:
虽然这道题目难度只是中等,但是这道题目具有相当的意义。第一遍刷题的时候我一般都会先避开这样的,随着时间的推移,我逐渐开始着手这样的题目。
首先根据对于数独的一般理解,横向、纵向不能存在重复的,而这道题目还加上了每一个3*3的九宫格也不能存在重复元素。
根据上述分析,比较自然的可以想到创建三个列表储存目标数据,然而进行比较是否存在重复元素,进而进行相关判断。
其中对于3*3的九宫格的索引值计算是一个需要思考的点:
k = (i//3)*3 + j//3
其中, i和j分别代表了数独原始的坐标
那么,根据上面的分析可以写出最终的AC解:
class Solution(object):
def isValidSudoku(self, board):
"""
:type board: List[List[str]]
:rtype: bool
"""
rows = [[] for i in range(9)]
cols = [[] for i in range(9)]
cells = [[] for i in range(9)]
for i, row in enumerate(board):
for j, num in enumerate(row):
if num != '.':
k = (i // 3) *3 + j // 3
if num in rows[i] + cols[j] + cells[k]:
return False
rows[i].append(num)
cols[j].append(num)
cells[k].append(num)
return True
最后,还需要感谢这位博主的blog,从中学到很多,特此感谢
https://blog.csdn.net/huhehaotechangsha/article/details/80538675