leetcode 每日一题 73. 矩阵置零
记录行列
思路:
先遍历用额外的空间记录为0的行和列,再遍历将对应的行列置为0。
代码:
class Solution: def setZeroes(self, matrix: List[List[int]]) -> None: """ Do not return anything, modify matrix in-place instead. """ row = set() col = set() m = len(matrix) n = len(matrix[0]) for i in range(m): for j in range(n): if matrix[i][j] == 0: row.add(i) col.add(j) for i in range(m): for j in range(n): if i in row or j in col: matrix[i][j] = 0
不使用额外空间
思路:
遍历数组,如果遇到0将对应行列里非0元素变为一个足够小的数。再遍历一次,如果元素是那个足够小的数,将其置为0。
代码:
class Solution: def setZeroes(self, matrix: List[List[int]]) -> None: """ Do not return anything, modify matrix in-place instead. """ MODIFIED = -1000000 r = len(matrix) c = len(matrix[0]) for i in range(r): for j in range(c): if matrix[i][j] == 0: for k in range(c): matrix[i][k] = MODIFIED if matrix[i][k] != 0 else 0 for k in range(r): matrix[k][j] = MODIFIED if matrix[k][j] != 0 else 0 for i in range(r): for j in range(c): if matrix[i][j] == MODIFIED: matrix[i][j] = 0
标记法
思路:
遍历用矩阵的第一行和第一列来标记当前行是否为0,当前列是否为0。
代码:
class Solution(object): def setZeroes(self, matrix): """ :type matrix: List[List[int]] :rtype: void Do not return anything, modify matrix in-place instead. """ is_col = False R = len(matrix) C = len(matrix[0]) for i in range(R): if matrix[i][0] == 0: is_col = True for j in range(1, C): if matrix[i][j] == 0: matrix[0][j] = 0 matrix[i][0] = 0 for i in range(1, R): for j in range(1, C): if not matrix[i][0] or not matrix[0][j]: matrix[i][j] = 0 if matrix[0][0] == 0: for j in range(C): matrix[0][j] = 0 if is_col: for i in range(R): matrix[i][0] = 0