01.08. 零矩阵
中等
提示
编写一种算法,若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]
]
尝试一:借用额外boolean数组
尝试代码
public static void main(String[] args) {
int[][] nums = {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 0}, {1, 2, 3, 4, 5}, {6, 7, 8, 9, 0}, {1, 2, 3, 4, 5}};
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < nums[i].length; j++) {
System.out.print(nums[i][j] + " ");
}
System.out.println();
}
System.out.println("-----------------------");
//使用同样大小的boolean数组来对应位置赋值0,初始化为false,为0的位置就是true
boolean[][] target = new boolean[nums.length][nums.length];
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < nums[i].length; j++) {
//当前为0号位,当前横轴和纵轴都为0,对应到target数组中都为true
if (nums[i][j] == 0) {
//i不变,横轴变
for (int s = 0; s < nums[i].length; s++) {
target[i][s] = true;
}
//j不变,纵轴变
for (int s = 0; s < nums.length; s++) {
target[s][j] = true;
}
}
}
}
for (int i = 0; i < target.length; i++) {
for (int j = 0; j < target[i].length; j++) {
if(target[i][j]) nums[i][j] = 0;
}
}
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < nums[i].length; j++) {
System.out.print(nums[i][j] + " ");
}
System.out.println();
}
}
实际代码
/**
模板对照:
1.初始化boolean模板数组target用于对照哪些地方需要为0,为0当前则为true
2.遍历matrix数组查看0的位置,对应再置换target整个横坐标和整个纵坐标元素为true
3.最后遍历对照target更改matrix数组相应位置为0
*/
class Solution {
public void setZeroes(int[][] matrix) {
//由于实时操作将会影响后续结果,故此初始化对照模板数组
boolean[][] target = new boolean[matrix.length][matrix[0].length];
for(int i = 0;i < matrix.length; i++){
for(int j = 0;j < matrix[i].length;j++){
//置换target对应位置
if(matrix[i][j] == 0){
//置换target对应横坐标元素
for(int index = 0;index < matrix[i].length;index++){
target[i][index] = true;
}
//置换纵坐标元素
for(int index = 0;index < matrix.length;index++){
target[index][j] = true;
}
}
}
}
for(int i = 0;i < matrix.length; i++){
for(int j = 0;j < matrix[i].length; j++){
if(target[i][j]){
matrix[i][j] = 0;
}
}
}
}
}