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。