第五天
数组 哈希表 矩阵
36.有效的数独
https://leetcode.cn/problems/valid-sudoku/
数组 哈希表 矩阵
请你判断一个 9 x 9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
1、数字 1-9 在每一行只能出现一次。
2、数字 1-9 在每一列只能出现一次。
3、数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
**哈希表是怎么记录的:**遍历数独,如果出现了数字num,则创建的哈希表中在num - 1的索引位置加1,代表这个数字出现过一次。
注:定义9个3x3的三维数组,注意数组的索引范围,subBoxs[x][y][z],x可以取0到8,y可以取值0,1,2,z可以取值0,1,2。
三维数组被绕晕了
用二维数组表示3x3
class Solution:
def isValidSudoku(self, board: List[List[str]]) -> bool:
rows = [[0] * 9 for _ in range(9)]
cols = [[0] * 9 for _ in range(9)]
subBoxs = [[0] * 9 for _ in range(9)]
for i in range(9):
for j in range(9):
if board[i][j] != '.':
num = int(board[i][j]) - 1
index = (i // 3) * 3 + j // 3
rows[i][num] += 1
cols[j][num] += 1
subBoxs[index][num] += 1
if rows[i][num] > 1 or cols[j][num] > 1 or subBoxs[index][num] > 1:
return False
return True
class Solution:
def isValidSudoku(self, board: List[List[str]]) -> bool:
rows = [[0] * 9 for _ in range(9)]
cols = [[0] * 9 for _ in range(9)]
subBoxs = [[0] * 9 for _ in range(9)]
for i in range(9):
for j in range(9):
if board[i][j] != '.':
num = int(board[i][j]) - 1
index = (i // 3) * 3 + j // 3
if rows[i][num] or cols[j][num] or subBoxs[index][num]:
return False
rows[i][num] = cols[j][num] = subBoxs[index][num] = 1
return True
73.矩阵置零
参考官方解法
方法一:使用标记数组
思路和算法:
我们可以用两个标记数组分别记录每一行和每一列是否有零出现。
具体地,我们首先遍历该数组一次,如果某个元素为 0,那么就将该元素所在的行和列所对应标记数组的位置置为
true
\text{true}
true。最后我们再次遍历该数组,用标记数组更新原数组即可。
class Solution:
def setZeroes(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
m, n = len(matrix), len(matrix[0])
row, col = [False] * m, [False] * n
for i in range(m):
for j in range(n):
if matrix[i][j] == 0:
row[i] = col[j] = True
for i in range(m):
for j in range(n):
if row[i] or col[j]:
matrix[i][j] = 0
方法二:使用两个标记变量
class Solution:
def setZeroes(self, matrix: List[List[int]]) -> None:
m, n = len(matrix), len(matrix[0])
flag_col0 = any(matrix[i][0] == 0 for i in range(m))
flag_row0 = any(matrix[0][j] == 0 for j in range(n))
for i in range(1, m):
for j in range(1, n):
if matrix[i][j] == 0:
matrix[i][0] = matrix[0][j] = 0
for i in range(1, m):
for j in range(1, n):
if matrix[i][0] == 0 or matrix[0][j] == 0:
matrix[i][j] = 0
if flag_col0:
for i in range(m):
matrix[i][0] = 0
if flag_row0:
for j in range(n):
matrix[0][j] = 0
方法三:使用一个标记变量
class Solution:
def setZeroes(self, matrix: List[List[int]]) -> None:
m, n = len(matrix), len(matrix[0])
flag_col0 = False
for i in range(m):
if matrix[i][0] == 0:
flag_col0 = True
for j in range(1, n):
if matrix[i][j] == 0:
matrix[i][0] = matrix[0][j] = 0
for i in range(m - 1, -1, -1):
for j in range(1, n):
if matrix[i][0] == 0 or matrix[0][j] == 0:
matrix[i][j] = 0
if flag_col0:
matrix[i][0] = 0。