持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情
国庆第二天了,迎来了首道中等题,迎刃而解!!
零矩阵
该题出自力扣的面试01.08题 —— 零矩阵【中等题】
审题
编写一种算法,若M × N矩阵中某个元素为0,则将其所在的行与列清零。
- 这道题题目很简单,只有一句话,就是给出一个二维数组的矩阵,并且给出规则,数组内存在0的,横排和竖排都需要清零
- 需要注意的是,如果横排和竖排同时存在多个0,那么,并不会覆盖作用,被盖住的0依然会发挥自身的规则影响
- 因此,需要统计每个位置对应的0的使用情况
- 定义一个相同长度的二维数组,值为布尔值,初始值为false
- 双重for循环遍历二维数组,如果当前下标等于0,并且下标对应的布尔值数组不为false的话,则证明未处理过,因此可以执行转换规则,调用相关的私有函数
- 定义私有函数,作为二维数组的转换使用,两个for 循环,对应循环二维数组的行和列,设置对应下标的值为0,并且设置布尔数组的值为true
- 使用一个标记变量记录第一列是否原本存在 0。这样,第一列的第一个元素即可以标记第一行是否出现 0。
编码
class Solution {
public void setZeroes(int[][] matrix) {
int n = matrix.length,m = matrix[0].length;
b = new boolean[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (matrix[i][j] == 0 && !b[i][j]){
// 函数调用 + b 的 修改
match(matrix,i ,j);
}
}
}
}
boolean[][] b;
private void match(int[][] matrix,int i ,int j){
for (int k = 0; k < matrix[0].length; k++) {
if (matrix[i][k] != 0){
matrix[i][k] = 0;
b[i][k] = true;
}
}
for (int k = 0; k < matrix.length; k++) {
if (matrix[k][j] != 0){
matrix[k][j] = 0;
b[k][j] = true;
}
}
}
}