一、题目描述
1.1 题目
-
矩阵置零
-
给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。
-
示例 1:
输入:
[
[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]
]
- 进阶:
(1)一个直接的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案。
(2)一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
(3)你能想出一个常数空间的解决方案吗?
1.2 知识点
- 数组
1.3 题目链接
二、解题思路
2.1 自研思路
- 判断首行首列是否存在零,并将判断结果存放于两个布尔变量中;
- 遍历整个二维数组,如果某点为零,则在该点对应的首行和首列中标记(置零);
- 根据首行首列存放的置零状态,对需要置零的行和列进行置零;
- 根据开始时记录的首行和首列的状态,如果首行首列存在零则对其进行置零操作;
三、实现代码
3.1 自研实现
class Solution {
public void setZeroes(int[][] matrix) {
// 判断首行是否存在零
boolean rowFlag = false;
for (int i = 0; i < matrix[0].length; i++) {
if (matrix[0][i] == 0) {
rowFlag = true;
break;
}
}
// 判断首列是否存在零
boolean colFlag = false;
for (int i = 0; i < matrix.length; i++) {
if (matrix[i][0] == 0) {
colFlag = true;
break;
}
}
// 当某个坐标为零时将其首行首列标记为零
for (int i = 1; i < matrix.length; i++) {
for (int j = 1; j < matrix[0].length; j++) {
if (matrix[i][j] == 0){
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
// 列置零
for (int i = 1; i < matrix[0].length; i++) {
if (matrix[0][i] == 0) {
for (int j = 0; j < matrix.length; j++) {
matrix[j][i] = 0;
}
}
}
// 行置零
for (int i = 1; i < matrix.length; i++) {
if (matrix[i][0] == 0) {
for (int j = 0; j < matrix[0].length; j++) {
matrix[i][j] = 0;
}
}
}
// 处理首行首列需要置零的情况
if (rowFlag){
for (int i = 0; i < matrix[0].length; i++) {
matrix[0][i] = 0;
}
}
if (colFlag){
for (int i = 0; i < matrix.length; i++) {
matrix[i][0] = 0;
}
}
}
}