1. 概述

给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。

2. 解题

  1. <?php
  2. function printMatrix($matrix) {
  3. array_walk($matrix, function (&$v) {
  4. $v = implode(',', $v);
  5. $v = "[{$v}]";
  6. });
  7. print_r($matrix);
  8. }
  9. class Solution {
  10. /**
  11. * @param Integer[][] $matrix
  12. * @return NULL
  13. */
  14. public function setZeroes(&$matrix) {
  15. $row = count($matrix);
  16. $col = count($matrix[0]);
  17. // 遍历除首行,首列外,如果有需要置0的行或列, 记录到首行首列中
  18. for ($i = 1; $i < $row; $i++) {
  19. for ($j = 1; $j < $col; $j++) {
  20. if ($matrix[$i][$j] == 0) {
  21. $matrix[0][$j] = 0;
  22. $matrix[$i][0] = 0;
  23. }
  24. }
  25. }
  26. // 遍历需要置0的行列
  27. for ($i = 1; $i < $row; $i++) {
  28. if ($matrix[$i][0] != 0) {
  29. continue;
  30. }
  31. for ($j = 1; $j < $col; $j++) {
  32. $matrix[$i][$j] = 0;
  33. }
  34. }
  35. for ($j = 1; $j < $col; $j++) {
  36. if ($matrix[0][$j] != 0) {
  37. continue;
  38. }
  39. for ($i = 0; $i < $row; $i++) {
  40. $matrix[$i][$j] = 0;
  41. }
  42. }
  43. // 处理首行,首列需要置0
  44. $firstRow = $firstCol = false;
  45. for ($i = 0; $i < $row; $i++) {
  46. if ($firstCol) {
  47. $matrix[$i][0] = 0;
  48. continue;
  49. }
  50. if ($matrix[$i][0] == 0) {
  51. $i = 0;
  52. $firstCol = true;
  53. }
  54. }
  55. for ($j = 0; $j < $col; $j++) {
  56. if ($firstRow) {
  57. $matrix[0][$j] = 0;
  58. continue;
  59. }
  60. if ($matrix[0][$j] == 0) {
  61. $j = 0;
  62. $firstRow = true;
  63. }
  64. }
  65. return;
  66. }
  67. }
  68. $matrix = [
  69. [0,1,2,0],
  70. [3,4,5,2],
  71. [1,3,1,5]
  72. ];
  73. printMatrix($matrix);
  74. $cls = new Solution();
  75. $cls->setZeroes($matrix);
  76. printMatrix($matrix);