粗一看,扫面矩阵,遇到0之后把所在行所在列的都设置成0。但是,很快会发现,整个矩阵都是0了。这显然不符合题目的要求。
正确的做法应该是先扫面一次矩阵,看那些位置上出现了0,我们不用精确的记录位置,只要记录要标记为0的行号和列号就好了,这里,使用bool数组完成这件事。接着第二次扫描数组,根据第一次扫描记录的结果,把对应元素设置成0即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| public static void SetZeros(int[,] matrix) { int m = matrix.GetLength(0); int n = matrix.GetLength(1); bool[] row = new bool[m]; bool[] col = new bool[n];
for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (matrix[i, j] == 0) { row[i] = true; col[j] = true; } } }
for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (row[i] || col[j]) { matrix[i, j] = 0; } } } }
|