https://leetcode.com/problems/valid-sudoku/description/ 题意:给一个数独九宫格,判断是否冲突,暂且不用判断是否能补全 思路1:暴力,直接三遍循环,分别检测每行,每列,每块,判断0~9出现的次数,最多不能超过一次,否则false
class Solution: def isValidSudoku(self, board): """ :type board: List[List[str]] :rtype: bool """ dic = {"0":1, "1":1, "2":1, "3":1, "4":1, "5":1, "6":1, "7":1, "8":1, "9":1} #每个数字的频率为1,存入字典 #每行 for i in range(9): tdic = dict() for j in range(9): char = board[i][j] if char in dic: #统计该数字的频率 if char in tdic: tdic[char] += 1 else: tdic[char] = 1 if tdic[char] > dic[char]: #超过1次 return False #每列 for j in range(9): tdic = dict() for i in range(9): char = board[i][j] if char in dic: if char in tdic: tdic[char] += 1 else: tdic[char] = 1 if tdic[char] > dic[char]: return False #每块 for i in range(3): for j in range(3): tdic = dict() for k in range(i*3, (i+1)*3): for l in range(j*3, (j+1)*3): char = board[k][l] if char in dic: if char in tdic: tdic[char] += 1 else: tdic[char] = 1 if tdic[char] > dic[char]: return False return True思路2:实际上不用三次大循环,只需要对i,j分别外内层两重循环即可。需要改变的是下标的计算方式,若对每行检测,访问顺序就是[i][j],对每列是[j][i],对每块需要将i,j以某种映射对应,具体见代码。 此外检测用一个新的数据结构set,初始为空,遇到一个新字符就加入,若字符已经存在,说明不符合。
class Solution: def isValidSudoku(self, board): """ :type board: List[List[str]] :rtype: bool """ for i in range(9): rows = set() #每次i循环检测第i行 cols = set() #每次i循环检测第i列 cubes = set() #每次循环检测一块 for j in range(9): char = board[i][j] if char != '.': if char not in rows: rows.add(char) else: return False char = board[j][i] if char != '.': if char not in cols: cols.add(char) else: return False rowIndex = 3*(i//3) colIndex = 3*(i%3) char = board[rowIndex + j//3][colIndex + j%3] if char != '.': if char not in cubes: cubes.add(char) else: return False return True