Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in-place.
Example 1:
Input: [ [1,1,1], [1,0,1], [1,1,1] ] Output: [ [1,0,1], [0,0,0], [1,0,1] ]
Example 2:
Input: [ [0,1,2,0], [3,4,5,2], [1,3,1,5] ] Output: [ [0,0,0,0], [0,4,5,0], [0,3,1,0] ]
题意
给定一个矩阵,只要某个元素为0,就把对应的整行整列都置0。
思路:
题目要求O(1) space, 复用第一行第一列作参照。
若input matrix是:
1. 先扫第一行,将有0的位置做标记; 再扫第一列,将有0的位置做标记
2. 将第一行第一列作参照,处理matrix剩余部分:扫matrix[i][j], 若为0,则反向去第一行第一列fill 0(做标记)
3. 再扫matrix[i][j], 若之前对应的第一行第一列有fill 0的标记,则 fill myself as 0
4. 最后处理参照物第一行第一列自己
代码
1 class Solution { 2 public void setZeroes(int[][] matrix) { 3 final int rowLen = matrix.length; 4 final int colLen = matrix[0].length; 5 boolean row_has_zero = false; // 第一行是否存在 0 6 boolean col_has_zero = false; // 第一列是否存在 0 7 8 for (int j = 0; j < colLen; j++){ 9 if (matrix[0][j] == 0) { 10 row_has_zero = true; 11 break; 12 } 13 } 14 15 for (int i = 0; i < rowLen; i++){ 16 if (matrix[i][0] == 0) { 17 col_has_zero = true; 18 break; 19 } 20 } 21 22 for (int i = 1; i < rowLen; i++){ 23 for (int j = 1; j < colLen; j++){ 24 if (matrix[i][j] == 0) { 25 matrix[0][j] = 0; 26 matrix[i][0] = 0; 27 } 28 } 29 } 30 31 for (int i = 1; i < rowLen; i++){ 32 for (int j = 1; j < colLen; j++){ 33 if (matrix[i][0] == 0 || matrix[0][j] == 0){matrix[i][j] = 0;} 34 } 35 } 36 //不能先fill第一行和第一列,因为把第一行第一列当成了参照 37 if (row_has_zero){ 38 for (int j = 0; j < colLen; j++){ 39 matrix[0][j] = 0; 40 } 41 } 42 if (col_has_zero){ 43 for (int i = 0; i < rowLen; i++){ 44 matrix[i][0] = 0; 45 } 46 } 47 } 48 }