矩阵数组脑筋急转弯

难度中等

题目描述

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
进阶:
一个直观的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案。
一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
你能想出一个仅使用常量空间的解决方案吗?
image.png
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/set-matrix-zeroes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

https://leetcode-cn.com/problems/set-matrix-zeroes/solution/o1kong-jian-by-powcai/
思路:
思路一: 用 O(m+n)O(m+n)额外空间
两遍扫matrix,第一遍用集合记录哪些行,哪些列有0;第二遍置0

思路二: 用O(1)O(1)空间
关键思想: 用matrix第一行和第一列记录该行该列是否有0,作为标志位
但是对于第一行,和第一列要设置一个标志位,为了防止自己这一行(一列)也有0的情况.注释写在代码里,直接看代码很好理解!

作者:powcai
链接:https://leetcode-cn.com/problems/set-matrix-zeroes/solution/o1kong-jian-by-powcai/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Code

  1. public void setZeroes(int[][] matrix) {
  2. int row = matrix.length;
  3. int col = matrix[0].length;
  4. boolean row0_flag = false;
  5. boolean col0_flag = false;
  6. // 第一行是否有零
  7. for (int j = 0; j < col; j++) {
  8. if (matrix[0][j] == 0) {
  9. row0_flag = true;
  10. break;
  11. }
  12. }
  13. // 第一列是否有零
  14. for (int i = 0; i < row; i++) {
  15. if (matrix[i][0] == 0) {
  16. col0_flag = true;
  17. break;
  18. }
  19. }
  20. // 把第一行第一列作为标志位
  21. for (int i = 1; i < row; i++) {
  22. for (int j = 1; j < col; j++) {
  23. if (matrix[i][j] == 0) {
  24. matrix[i][0] = matrix[0][j] = 0;
  25. }
  26. }
  27. }
  28. // 置0
  29. for (int i = 1; i < row; i++) {
  30. for (int j = 1; j < col; j++) {
  31. if (matrix[i][0] == 0 || matrix[0][j] == 0) {
  32. matrix[i][j] = 0;
  33. }
  34. }
  35. }
  36. if (row0_flag) {
  37. for (int j = 0; j < col; j++) {
  38. matrix[0][j] = 0;
  39. }
  40. }
  41. if (col0_flag) {
  42. for (int i = 0; i < row; i++) {
  43. matrix[i][0] = 0;
  44. }
  45. }
  46. }