-
题目链接 https://leetcode-cn.com/problems/set-matrix-zeroes/submissions/
-
题目描述
- 给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法
-
输入: [ [1,1,1], [1,0,1], [1,1,1] ] 输出: [ [1,0,1], [0,0,0], [1,0,1] ]
示例 2:
输入: [ [0,1,2,0], [3,4,5,2], [1,3,1,5] ] 输出: [ [0,0,0,0], [0,4,5,0], [0,3,1,0] ]
-
解题思路
- O(M + N)空间复杂度的解法: 建立两个数组,size分别等于行,和列。用于记录所在行或列是否有0存在。通过这两个数组将matrix置零,只有只要所在行或列有一个为0的就将该位置置0
- O(1)空间复杂度的解法: 找到一个全部非0的行,作为上述解法中标记列的数组.这样只需要一个存储全非0行数组下标的变量
-
代码
- python o(m + n)
class Solution: def setZeroes(self, matrix): """ Do not return anything, modify matrix in-place instead. """ N, M = len(matrix), len(matrix[0]) C, R = [1] * N, [1] * M for i in range(N): for j in range(M): C[i] &= (matrix[i][j] != 0) R[j] &= (matrix[i][j] != 0) for i in range(N): for j in range(M): matrix[i][j] = C[i] & R[j] and matrix[i][j]
- python o(1)
class Solution: def setZeroes(self, matrix): """ Do not return anything, modify matrix in-place instead. """ all_no_0 = -1 n, m = len(matrix), len(matrix[0]) for i in range(n): # 找到一个全非0行 和一个有0行 if all_no_0 == -1: for j in range(m): if matrix[i][j] == 0: break else: all_no_0 = i if all_no_0 == -1: # 都是没有全非0行 那么matrix 全部为1 for i in range(n): for j in range(m): matrix[i][j] = 0 else: for i in range(m): # 标记列 for j in range(n): if matrix[j][i] == 0: matrix[all_no_0][i] = 0 break for i in range(n): # 行置0 if i != all_no_0: for j in range(m): if matrix[i][j] == 0: for j in range(m): matrix[i][j] = 0 break for i in range(m): # 列置0 if matrix[all_no_0][i] == 0: for j in range(n): matrix[j][i] = 0
- python o(m + n)
leetcode 73. 矩阵置零
最新推荐文章于 2022-07-16 22:58:03 发布