-
解题思路:如何原地,是困难点。我们可以使用原有的矩阵,来存放某些信息。原来的矩阵第一行,
matrix[0][i]
如果等于0,代表第i
列有0,原来的矩阵第一列,matrix[i][0]
如果等于0,代表第i
列有0。还有一个注意点,就是matrix[0][0]
代表什么?这是一个歧义的点,所以不存放数据,单独用两个变量,first_r
如果等于0,代表第0行有0,first_c
如果等于0,代表第0列有0。 -
代码
class Solution: def setZeroes(self, matrix: List[List[int]]) -> None: # 使用第0行和第0列, 判断是否有0出现,然后再统一修改矩阵 # 例如,matrix[0][i] == 0,代表的是第i列有一个0 # matrix[i][0] == 0,代表的是第i行有一个0 r = len(matrix) c = len(matrix[0]) # 第0行和第1列的零的个数要分别统计,因为共用了matrix[0][0] first_r = -1 first_c = -1 for i in range(0, c, 1): # 统计第一行是否有0 if matrix[0][i] == 0: first_r = 0 break for i in range(0, r, 1): # 统计第一列是否有0 if matrix[i][0] == 0: first_c = 0 break # 统计其他的是否有0 for i in range(1, r, 1) : for j in range(1, c, 1): if matrix[i][j] == 0: matrix[i][0] = 0 matrix[0][j] = 0 # 开始改变矩阵 for i in range(1, r, 1): for j in range(1, c, 1): if matrix[i][0] == 0 or matrix[0][j] == 0: matrix[i][j] = 0 # 单独处理第0行和第0列 if first_c == 0: # 第一列 for i in range(0, r, 1): matrix[i][0] = 0 if first_r == 0: # 第一行 for j in range(0, c, 1): matrix[0][j] = 0