一、题目
1、审题
2、分析
给出一个 mXn 二维矩阵,若 [i][j] 值为 0, 则矩阵第 i 行,第 j 列化为 0。
二、解答
1、思路:
方法一、
矩阵行长为 m,列长为 n,新建两个大小为 m、n的一维数组,用于记录该行、列是否为 0,最终,遍历数组给矩阵赋值即可。
使用额外空间 O(m+n)
public void setZeroes(int[][] matrix) { int m = matrix.length; int n = matrix[0].length; int[] rowArr = new int[m]; int[] columnArr = new int[n]; for (int i = 0; i < m; i++){ for (int j = 0; j < n; j++) if(matrix[i][j] == 0) { rowArr[i] = 1; columnArr[j] = 1; } } // 行化为 0 for (int i = 0; i < m; i++) { if(rowArr[i] == 1) { for (int j = 0; j < n; j++) { matrix[i][j] = 0; } } } // 列化为 0 for (int i = 0; i < n; i++) { if(columnArr[i] == 1) { for (int j = 0; j < m; j++) { matrix[j][i] = 0; } } } }
方法二、
将矩阵的第一行、第一列用作标记项;若 [i][j] 出现元素值为 0, 则 [i][0] 赋值 0,[0][j] 赋值为 0;
由于遍历矩阵时,[0][0] 用于标记第一行是否为 0,故第一列是否为 0 需要另外申请一个变量 col0 记录;
使用存储空间为 O(1)
public void setZeroes2(int[][] matrix) { int rows = matrix.length; int columns = matrix[0].length; int col0 = 1; for (int i = 0; i < rows; i++) { if(matrix[i][0] == 0) col0 = 0; // 标记第一列是否为 0 // 第一行、第一列用于作标记 for (int j = 1; j < columns; j++) { if(matrix[i][j] == 0){ matrix[i][0] = 0; matrix[0][j] = 0; } } } for (int i = rows - 1; i >= 0; i--) { for(int j = columns - 1; j >= 1; j--) if(matrix[i][0] == 0 || matrix[0][j] == 0) matrix[i][j] = 0; if(col0 == 0) matrix[i][0] = 0; } }