题目:
给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。
例如:
输入:
[
[1,1,1],
[1,0,1],
[1,1,1]
]
输出
[
[1,0,1],
[0,0,0],
[1,0,1]
]
思路:题目要求in_place,这样的话就不能再另开辟空间作为标记;我们只能在原有的数组上进行标记。
1.检查第一行和第一列是否有0;
2.检查除了第一行第一列的其他元素是否为0;如果为0的话,将其对应于第一行、第一列的元素置为0;
3.执行第一行第一列之外的元素为0;
4.将为0的第一列第一行全部设为0;
代码如下:
class Solution{
public void setZeroes(int[][] matrix) {
boolean isZeroRow=false;
boolean isZeroCol=false;
//检查第一行
for(int i=0;i<matrix[0].length;i++){
if(matrix[0][i]==0){
isZeroRow=true;
break;
}
}
//检查第一列
for(int i=0;i<matrix.length;i++){
if(matrix[i][0]==0){
isZeroCol=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;
}
}
}
//将除了第一行第一列的其他元素置为0
for(int i=1;i<matrix.length;i++){
for(int j=1;j<matrix[0].length;j++){
if(matrix[i][0]==0||matrix[0][j]==0){
matrix[i][j]=0;
}
}
}
if(isZeroRow){
for(int i=0;i<matrix[0].length;i++){
matrix[i][0]=0;
}
}
if(isZeroCol){
for(int j=0;j<matrix.length;j++){
matrix[0][j]=0;
}
}
}
}
思路理清之后,代码实现起来不难。
时间复杂度:O(N^2);空间复杂度:O(1);