题目

类型:HashTable
image.png

解题思路

为了防止每一列的第一个元素被提前更新,需要从最后一行开始,倒序地处理矩阵元素。比如下面这个矩阵
[0,1,2,0]
[3,4,5,2]
[1,3,1,5]
按照算法三, 之所以要从后面开始处理, 是因为如果先处理了第一行那么矩阵变成了
[0,0,0,0]
[3,4,5,2]
[1,3,1,5]
第一行的第二列和第三列的0元素影响了下面的 4, 5 和3, 1
但是其实这两个0不是本来存在的, 而是处理之后出现的
所以从下面处理, 就不会被这两个0影响了

代码

  1. class Solution {
  2. public void setZeroes(int[][] matrix) {
  3. int m = matrix.length, n = matrix[0].length;
  4. boolean flagCol0 = false;
  5. for (int i = 0; i < m; i++) {
  6. if (matrix[i][0] == 0) {
  7. flagCol0 = true;
  8. }
  9. for (int j = 1; j < n; j++) {
  10. if (matrix[i][j] == 0) {
  11. matrix[i][0] = matrix[0][j] = 0;
  12. }
  13. }
  14. }
  15. for (int i = m - 1; i >= 0; i--) {
  16. for (int j = 1; j < n; j++) {
  17. if (matrix[i][0] == 0 || matrix[0][j] == 0) {
  18. matrix[i][j] = 0;
  19. }
  20. }
  21. if (flagCol0) {
  22. matrix[i][0] = 0;
  23. }
  24. }
  25. }
  26. }