Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
编写一种算法,若M × N矩阵中某个元素为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]
]
二、思路分析:
这是一道简单的题,我的思路就是使用一个辅助数组,复制一个和题目给的数组一模一样的数组,遍历辅助数组,然后在给定数组上操作,遇到0时,就将给定数组的列和行置为0。
代码实现起来也十分简单,但是这样肯定是最耗费空间的方法,使用了给定数组大小的额外空间。还会有多次重复操作同一列的情况。
如果一行有一个数为0,那么整行都会置为0,如果一列有一个数为0,整列都会置为0,所以可以使用两个一位数组,分别记录行和列有0的下标,然后再判断如果行或者列有0.则把当前数置0。
三、AC 代码:
//第一种
class Solution {
public void setZeroes(int[][] matrix) {
int col = matrix[0].length;
int row = matrix.length;
int[][] temp = new int[row][col];
for(int i=0; i<row; i++){
for(int j=0; j<col; j++){
temp[i][j] = matrix[i][j];
}
}
for(int i=0; i<row; i++){
for(int j=0; j<col; j++){
if(temp[i][j]==0){
for(int k=0; k<col; k++){
matrix[i][k]=0;
}
for(int k=0; k<row; k++){
matrix[k][j]=0;
}
}
}
}
}
}
//第二种
class Solution {
public void setZeroes(int[][] matrix) {
int col = matrix[0].length;
int row = matrix.length;
boolean[] colArr = new boolean[col];
boolean[] rowArr = new boolean[row];
for(int i=0; i<row; i++){
for(int j=0; j<col; j++){
if(matrix[i][j]==0){
colArr[j]=true;
rowArr[i]=true;
}
}
}
for(int i=0; i<row; i++){
for(int j=0; j<col; j++){
if(rowArr[i] || colArr[j]){
matrix[i][j] = 0;
}
}
}
}
}
总结
第二种方法明显比第一种要好很多,执行结果也从1ms变成了0ms,如果你有更好的方法请在评论区交流讨论哦。