LeetCode Online Judge 题目C# 练习 - Set Matrix Zeroes

Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.

 1         public static void SetMatrixZeros(List<List<int>> matrix)
 2         {
 3             bool col0 = false;
 4             for (int i = 0; i < matrix.Count; i++)
 5             {
 6                 for (int j = 0; j < matrix[i].Count; j++)
 7                 {
 8                     if (matrix[i][j] == 0)
 9                     {
10                         if (j == 0)
11                             col0 = true;
12                         else
13                         {
14                             matrix[i][0] = 0;
15                             matrix[0][j] = 0;
16                         }
17                     }
18                 }
19             }
20 
21             for (int j = 1; j < matrix[0].Count; j++)
22             {
23                 if (matrix[0][j] == 0)
24                 {
25                     for (int i = 1; i < matrix.Count; i++)
26                     {
27                         matrix[i][j] = 0;
28                     }
29                 }
30             }
31 
32             for (int i = 0; i < matrix.Count; i++)
33             {
34                 if (matrix[i][0] == 0)
35                 {
36                     for (int j = 1; j < matrix[i].Count; j++)
37                     {
38                         matrix[i][j] = 0;
39                     }
40                 }
41             }
42 
43             if (col0)
44             {
45                 for (int i = 0; i < matrix.Count; i++)
46                 {
47                     matrix[i][0] = 0;
48                 }
49             }
50         }

代码分析:

  上面代码的Space(1)的做法,最好的的做法。

  Space(m * n),最简单的做法是是, 建一个一样m * n 的矩阵,标记需要改为0的坐标。然后在loop一遍矩阵,在原矩阵改0

  Space (m + n), 稍好一点的做法, 建两个数组,row[], col[], 标记需要改为0的 行 和 列。然后在loop一遍两数组,在原矩阵改0

  Space (1),就是代码中的做法,在loop原矩阵的时候,把该 行 和 列的第一个元素标0, 在loop一遍行,一边列,改0。有个问题是,loop列的时候要去掉第一列,不然下面loop行的时候就会全变 0 了,所以用一个flag,标记第一列需要改0。