文章目录
Python小白 Leetcode刷题历程 No.36-No.40 有效的数独、解数独、外观数列、组合总和、组合总和Ⅱ
写在前面:
作为一个计算机院的大学生,总觉得仅仅在学校粗略的学习计算机专业课是不够的,尤其是假期大量的空档期,作为一个小白,实习也莫得路子,又不想白白耗费时间。于是选择了Leetcode这个平台来刷题库。编程我只学过基础的C语言,现在在自学Python,所以用Python3.8刷题库。现在我Python掌握的还不是很熟练,算法什么的也还没学,就先不考虑算法上的优化了,单纯以解题为目的,复杂程度什么的以后有时间再优化。计划顺序五个题写一篇日志,希望其他初学编程的人起到一些帮助,写算是对自己学习历程的一个见证了吧。
有一起刷LeetCode的可以关注我一下,我会一直发LeetCode题库Python3解法的,也可以一起探讨。
觉得有用的话可以点赞关注下哦,谢谢大家!
········································································································································································
No.36.有效的数独
难度:中等
题目描述:
题解代码(Python3.8)
class Solution:
def isValidSudoku(self, board: List[List[str]]) -> bool:
set_box=set()
for i in range(9):
for j in range(9):
if board[i][j].isdigit():
row = 'row_'+str(i)+' ' + board[i][j]
col = 'col_'+str(j)+' ' + board[i][j]
small_square = 'row-col_'+str(i//3)+'-'+str(j//3)+' ' + board[i][j]
if row in set_box or col in set_box or small_square in set_box:
return False
set_box.update([row,col,small_square])
return True
或许有用的知识点:
set.add(key)可以在set中添加一个元素,set.remove(key)可以在set中删除一个元素。
如果想在set中一次性假如多个元素,可使用set.update([key1,key2,key3])。
解题思路:
在数独9宫格中,每个数字必定带有三个特性:行数、列数、小方块位置。对于一个i行j列的元素n,我们不妨定义它的特性为,row=row_i n , col=col_j n , small_square=row-col_(i//3)-(j)//3 n。对于每个数,我们将他的三个特性储存到一个set中。当新一个数字的三个特性都不在set中,我们便将其写入set;如果新一个数字有特性已经在set中了,不满足条件,返回False。