36. Valid Sudoku [easy] (Python)
2016-06-06 16:35
471 查看
题目链接
https://leetcode.com/problems/valid-sudoku/题目原文
Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules.The Sudoku board could be partially filled, where empty cells are filled with the character ‘.’.
A partially filled sudoku which is valid.
Note:
A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.
题目翻译
判断一个数独是否是有效的。判断依据:Sudoku Puzzles - The Rules。一个数独的表格可以是只填写了一部分,空的格子用点号’.’填充,比如,下图是一个有效的部分数独:
注意:一个有效的数独板(部分填充的)不一定可解。你只需要验证被填充的部分即可。
思路方法
首先,简单说一下规则:数独的每一行、每一列、9个九宫格里的数字只能是0-9,且不能重复。思路一
最直观的思路,三个规则全部检查一遍即可。代码
class Solution(object): def isValidSudoku(self, board): """ :type board: List[List[str]] :rtype: bool """ for i in range(9): if not self.isValidNine(board[i]): return False col = [c[i] for c in board] if not self.isValidNine(col): return False for i in [0, 3, 6]: for j in [0, 3, 6]: block = [board[s][t] for s in [i, i+1, i+2] for t in [j, j+1, j+2]] if not self.isValidNine(block): return False return True def isValidNine(self, row): map = {} for c in row: if c != '.': if c in map: return False else: map[c] = True return True
思路二
上面的代码虽然很好理解,但很冗余。我们可以用三个矩阵分别检查三个规则是否有重复数字,比如用row, col, block分别检查行、列、块是否有重复数字,代码如下:代码
class Solution(object): def isValidSudoku(self, board): """ :type board: List[List[str]] :rtype: bool """ # 注意:这里不能用[[False]*9]*9来初始化,牵涉到深浅拷贝的问题 row = [[False for i in range(9)] for j in range(9)] col = [[False for i in range(9)] for j in range(9)] block = [[False for i in range(9)] for j in range(9)] for i in range(9): for j in range(9): if board[i][j] != '.': num = int(board[i][j]) - 1 k = i/3*3 + j/3 if row[i][num] or col[j][num] or block[k][num]: return False row[i][num] = col[j][num] = block[k][num] = True return True
思路三
类似思路二,可以记录所有出现过的行、列、块的数字及相应位置,最后判断是否有重复。用set操作精简代码,可以有如下实现:代码
class Solution(object): def isValidSudoku(self, board): """ :type board: List[List[str]] :rtype: bool """ seen = [] for i, row in enumerate(board): for j, c in enumerate(row): if c != '.': seen += [(c,j),(i,c),(i/3,j/3,c)] return len(seen) == len(set(seen))
PS: 新手刷LeetCode,新手写博客,写错了或者写的不清楚还请帮忙指出,谢谢!
转载请注明:/article/11857857.html
相关文章推荐
- python-gdb
- python正则表达式 Python Re模块
- windows下安装numpy,scipy遇到的问题总结
- 深入理解python函数递归和生成器
- python dataframe 针对多列执行map操作
- Python 入门:字符串连接及join用法
- python下调用pytesseract识别某网站验证码的实现方法
- 利用python进行数据分析ch02(usa.gob)
- leetcode 275. H-Index II-h因子|二分查找
- python定时杀进程
- ubuntu下搭建Python开发环境(eclipse+pydev)
- 112. Path Sum [easy] (Python)
- 误删python setuptools的解决方案
- Python正则匹配 -> 模块和基本函数
- python生成器(转)
- Python实现MySQL DBA小工具一例 推荐
- 浅析AST抽象语法树及Python代码实现
- python set
- python logging使用
- Python学习笔记 —— 数字类型【Numbers】及常用方法