给定一个 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]
]
进阶:
- 一个直接的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案。
- 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
- 你能想出一个常数空间的解决方案吗?
思路:通过使用一维数组记录下二维数组中为 0 的元素,其中一维数组的下标和二维数组的下标是对应的, 那么然后通过遍历一维数组,遇到元素为 1 ,再将其下标转换为对应的二维数组,这里用到了除数和求余,随后将其行和列弄为 0 即可,这题转换思想类似于时间日期的一道题,时间日期那道题就是将小时转换为分钟数再加上分钟数,求出最大的数后,在利用除法和求余将其转换为小时表示。
代码:
public class Solution {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[][] a = {{1,1,1},
{1,0,1},
{1,1,1}};
setZeroes(a);
for(int i = 0;i < a.length;i++) {
for(int j = 0;j < a[i].length;j++) {
System.out.print(a[i][j]+" ");
}
}
}
public static int[][] setZeroes(int[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
int[] a = new int[m*n];
for(int i = 0;i < m;++i) {
for(int j = 0;j < n;++j){
if(matrix[i][j] == 0) {
a[i * n + j] = 1;
}
}
}
for(int k = 0;k < a.length;k++) {
if(a[k] == 1) {{
int b = k/n;
int c = k%n;
for(int i = 0;i < n;i++) {
matrix[b][i] = 0;
}
for(int j = 0;j < m;j++) {
matrix[j][c] = 0;
}
}
}
}
return matrix;
}
}