辅助空间

  • 行map
  • 列map

遍历一遍把两个map生成好
image.png

然后再去修改
统计与修改是分离的

2个变量

  • 变量1 第0行是否是0
  • 变量2 第0列是否是0

image.png
遍历第0行和第0列,更新这两个变量,那么我们就知道了第0行和第0列要不要全变0了
然后我们再把第0行和第0列当成两个map(行map, 列map),用来记录信息,
image.png

举个例子
image.png
然后遍历剩下的数
image.pngimage.png
遍历完后就可以修改了
image.png

  1. public void setZeroes(int[][] matrix) {
  2. boolean row0Zero = false;
  3. boolean col0Zero = false;
  4. int i = 0;
  5. int j = 0;
  6. for (i = 0; i < matrix[0].length; i++) {
  7. if (matrix[0][i] == 0) {
  8. row0Zero = true;
  9. break;
  10. }
  11. }
  12. for (i = 0; i < matrix.length; i++) {
  13. if (matrix[i][0] == 0) {
  14. col0Zero = true;
  15. break;
  16. }
  17. }
  18. for (i = 1; i < matrix.length; i++) {
  19. for (j = 1; j < matrix[0].length; j++) {
  20. if (matrix[i][j] == 0) {
  21. matrix[i][0] = 0;
  22. matrix[0][j] = 0;
  23. }
  24. }
  25. }
  26. for (i = 1; i < matrix.length; i++) {
  27. for (j = 1; j < matrix[0].length; j++) {
  28. if (matrix[i][0] == 0 || matrix[0][j] == 0) {
  29. matrix[i][j] = 0;
  30. }
  31. }
  32. }
  33. if (row0Zero) {
  34. for (i = 0; i < matrix[0].length; i++) {
  35. matrix[0][i] = 0;
  36. }
  37. }
  38. if (col0Zero) {
  39. for (i = 0; i < matrix.length; i++) {
  40. matrix[i][0] = 0;
  41. }
  42. }
  43. }

1个变量 (面试吹逼用)

用一个变量col_0 单独记录第0列的值要不要全变0,
然后左上角的值含义归属于行,

  • 也就是它仅仅代表第0行要不要全变0, 而不代表列

image.png

改的时候从下往上遍历,因为第0行是指导意义,放在最后改

image.png
第0列也是最后改的

  1. public static void setZeroes2(int[][] matrix) {
  2. boolean col0 = false;
  3. int i = 0;
  4. int j = 0;
  5. for (i = 0; i < matrix.length; i++) {
  6. for (j = 0; j < matrix[0].length; j++) {
  7. if (matrix[i][j] == 0) {
  8. matrix[i][0] = 0;
  9. if (j == 0) {
  10. col0 = true;
  11. } else {
  12. matrix[0][j] = 0;
  13. }
  14. }
  15. }
  16. }
  17. for (i = matrix.length - 1; i >= 0; i--) {
  18. for (j = 1; j < matrix[0].length; j++) {
  19. if (matrix[i][0] == 0 || matrix[0][j] == 0) {
  20. matrix[i][j] = 0;
  21. }
  22. }
  23. }
  24. if (col0) {
  25. for (i = 0; i < matrix.length; i++) {
  26. matrix[i][0] = 0;
  27. }
  28. }
  29. }