题意:

image.png

解题思路:

  1. 思路:
  2. 1.初始化第一行,第一列没有0
  3. 2.如果第一行,第一列有0,则标记
  4. 3.除了第一行,第一列外的元素如果有0,则把对应的行,列首位置,置为0作为标志位
  5. =》matrix[i][0] = 0;matrix[0][j] = 0
  6. 4.再把上面标志位对应的行列全部置为0[此标志位是第三步的标志位]
  7. 5.最后判断,首次标记的行列为0的情况,如果行列有对应为0,则把整行,或者整列全部置为0[此标志位是第二步的标志位]

PHP代码实现:

  1. class Solution {
  2. /**
  3. * @param Integer[][] $matrix
  4. * @return NULL
  5. */
  6. function setZeroes(&$matrix) {
  7. //行
  8. $row = count($matrix);
  9. //列
  10. $col = count($matrix[0]);
  11. // 判断第一列是否有0
  12. $firstRow = $firstCol = false;
  13. for ($i = 0; $i < $row; $i++) {
  14. if ($matrix[$i][0] == 0) {
  15. $firstRow = true;
  16. break;
  17. }
  18. }
  19. // 判断第一行是否有0
  20. for ($j = 0; $j < $col; $j++) {
  21. if ($matrix[0][$j] == 0) {
  22. $firstCol = true;
  23. break;
  24. }
  25. }
  26. // 把第一行第一列作为标志位
  27. for ($i = 1; $i < $row; $i++) {
  28. for ($j = 1; $j < $col; $j++) {
  29. if ($matrix[$i][$j] == 0) {
  30. $matrix[$i][0] = 0;
  31. $matrix[0][$j] = 0;
  32. }
  33. }
  34. }
  35. //标志位对应的行和列全置0
  36. for ($i = 1; $i < $row; $i++) {
  37. for ($j = 1; $j < $col; $j++) {
  38. if ($matrix[$i][0] == 0 || $matrix[0][$j] == 0) {
  39. $matrix[$i][$j] = 0;
  40. }
  41. }
  42. }
  43. //如果记录的列为true,则对应的列全部置0
  44. if ($firstRow) {
  45. for ($i = 0; $i < $row; $i++) {
  46. $matrix[$i][0] = 0;
  47. }
  48. }
  49. // 再如果记录的行为true,则对应的行全部置0
  50. if ($firstCol) {
  51. for ($j = 0; $j < $col; $j++) {
  52. $matrix[0][$j] = 0;
  53. }
  54. }
  55. }
  56. }

GO代码实现:

  1. func setZeroes(matrix [][]int) {
  2. if len(matrix) == 0 || len(matrix[0]) == 0 {
  3. return
  4. }
  5. m, n := len(matrix), len(matrix[0])
  6. rows, cols := make(map[int]bool), make(map[int]bool)
  7. for i := 0; i < m; i++ {
  8. if rows[i] { // 该行被标记置为0
  9. continue
  10. }
  11. for j := 0; j < n; j++ {
  12. if matrix[i][j] == 0 {
  13. rows[i], cols[j] = true, true // 将所在行、列标记
  14. }
  15. }
  16. }
  17. for r, _ := range rows { // 将标记的每一行置0
  18. for j := 0; j < n; j++ {
  19. matrix[r][j] = 0
  20. }
  21. }
  22. for col, _ := range cols { // 将标记的每一列置位0
  23. for i := 0; i < m; i++ {
  24. matrix[i][col] = 0
  25. }
  26. }
  27. return
  28. }