「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战」
前言
力扣第七十三题 矩阵置零 如下所示:
给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法 。
示例 1:
输入: matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出: [[1,0,1],[0,0,0],[1,0,1]]
示例 2:
输入: matrix = [[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。我们可以使用两个一维布尔数组来存储这个信息 boolean[] rowFlag 和 boolean[] colFlag
大致的步骤如下所示:
- 存储
0的位置:遍历二维数组matrix,如果martrix[i][j] == 0,则将rowFlag[i]和colFlag[j]置为true - 原地修改数组:再次遍历二维数组,如果
rowFlag[i] == true或colFlag[j] == true时,将martrix[i][j]置为0即可
举个例子
此处以 matrix = [[1,1,1],[1,0,1],[1,1,1]] 作为例子
- 存储
0的位置:遍历matrix后,可以将rowFlag[1]和colFlag[1]赋值为true - 原地修改:再次遍历
matrix,只要rowFlag[i] == true || colFlag[j] == true就将matrix[i][j]置为0 - 返回修改后的结果
[[1,0,1],[0,0,0],[1,0,1]]即可
二、实现
实现代码
实现代码与思路中保持一致
public void setZeroes(int[][] matrix) {
int rowLen = matrix.length;
int colLen = matrix[0].length;
boolean[] rowFlag = new boolean[rowLen];
boolean[] colFlag = new boolean[colLen];
// 存储0的位置
for (int i=0; i<rowLen; i++) {
for (int j=0; j<colLen; j++) {
if(matrix[i][j] == 0) {
rowFlag[i] = colFlag[j] = true;
}
}
}
// 原地修改
for (int i=0; i<rowLen; i++) {
for (int j = 0; j < colLen; j++) {
if (rowFlag[i] || colFlag[j]) {
matrix[i][j] = 0;
}
}
}
}
测试代码
public static void main(String[] args) {
int[][] matrix = {{1,1,1},{1,0,1},{1,1,1}};
new Number73().setZeroes(matrix);
}
结果
三、总结
我是用了 m x n 的空间来存储 0 的位置的,你是否可以使用更小的存储空间实现原地修改呢?(提示:可以将首行首列作为存储 0 的标志)
感谢看到最后,非常荣幸能够帮助到你~♥
如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~