73. 矩阵置零
1. 题目
给定一个 m x n
的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
示例 1:
1 | 输入:matrix = [[1,1,1],[1,0,1],[1,1,1]] |
示例 2:
1 | 输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]] |
提示:
m == matrix.length
n == matrix[0].length
1 <= m, n <= 200
-231 <= matrix[i][j] <= 231 - 1
进阶:
- 一个直观的解决方案是使用
O(mn)
的额外空间,但这并不是一个好的解决方案。 - 一个简单的改进方案是使用
O(m + n)
的额外空间,但这仍然不是最好的解决方案。 - 你能想出一个仅使用常量空间的解决方案吗?
2. 思路
- 题目要求矩阵中存在0的元素将其对应的行和列都统一置为0,并且要求进行原地操作
- 常规的思维是扫描二维数组中的所有单元格,记录下值为0的单元格,并在后续统一将对应的行与列转化为0,但是这种算法的空间复杂度是
O(n + m)
- 因此考虑将矩阵的第一行和第一列用于记录该行与列是否需要进行置0操作,并将该行与列原先是否需要置0记录于
firstRowContainsZero
与firstColumnContainsZero
变量中 - 整个代码分为以下5步:
- 初始化并设置
firstRowContainsZero
变量 - 初始化并设置
firstColumnContainsZero
变量 - 遍历除开第一行与第一列以外的所有元素,当出现值为0时,对应将首行和首列对应位置置为0,表示需要将该行/列进行置0
- 遍历第一行与第一列的置0情况,并按照规则对需要置空的行或列进行置空(置空不需要包含第一列与第一行)
- 检查
firstRowContainsZero
与firstColumnContainsZero
变量,如果变量为true
,则对应将首行/首列置为0
- 初始化并设置
3. 代码
1 | class Solution { |
4. 复杂度
- 时间复杂度:O(mn)
- 空间复杂度:O(1)