[leetcode]73. Set Matrix Zeroes矩阵置0

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 }
原文地址:https://www.cnblogs.com/liuliu5151/p/10953109.html