题意:
解题思路:
思路:1.初始化第一行,第一列没有02.如果第一行,第一列有0,则标记3.除了第一行,第一列外的元素如果有0,则把对应的行,列首位置,置为0作为标志位 =》matrix[i][0] = 0;matrix[0][j] = 04.再把上面标志位对应的行列全部置为0[此标志位是第三步的标志位]5.最后判断,首次标记的行列为0的情况,如果行列有对应为0,则把整行,或者整列全部置为0[此标志位是第二步的标志位]
PHP代码实现:
class Solution { /** * @param Integer[][] $matrix * @return NULL */ function setZeroes(&$matrix) { //行 $row = count($matrix); //列 $col = count($matrix[0]); // 判断第一列是否有0 $firstRow = $firstCol = false; for ($i = 0; $i < $row; $i++) { if ($matrix[$i][0] == 0) { $firstRow = true; break; } } // 判断第一行是否有0 for ($j = 0; $j < $col; $j++) { if ($matrix[0][$j] == 0) { $firstCol = true; break; } } // 把第一行第一列作为标志位 for ($i = 1; $i < $row; $i++) { for ($j = 1; $j < $col; $j++) { if ($matrix[$i][$j] == 0) { $matrix[$i][0] = 0; $matrix[0][$j] = 0; } } } //标志位对应的行和列全置0 for ($i = 1; $i < $row; $i++) { for ($j = 1; $j < $col; $j++) { if ($matrix[$i][0] == 0 || $matrix[0][$j] == 0) { $matrix[$i][$j] = 0; } } } //如果记录的列为true,则对应的列全部置0 if ($firstRow) { for ($i = 0; $i < $row; $i++) { $matrix[$i][0] = 0; } } // 再如果记录的行为true,则对应的行全部置0 if ($firstCol) { for ($j = 0; $j < $col; $j++) { $matrix[0][$j] = 0; } } }}
GO代码实现:
func setZeroes(matrix [][]int) { if len(matrix) == 0 || len(matrix[0]) == 0 { return } m, n := len(matrix), len(matrix[0]) rows, cols := make(map[int]bool), make(map[int]bool) for i := 0; i < m; i++ { if rows[i] { // 该行被标记置为0 continue } for j := 0; j < n; j++ { if matrix[i][j] == 0 { rows[i], cols[j] = true, true // 将所在行、列标记 } } } for r, _ := range rows { // 将标记的每一行置0 for j := 0; j < n; j++ { matrix[r][j] = 0 } } for col, _ := range cols { // 将标记的每一列置位0 for i := 0; i < m; i++ { matrix[i][col] = 0 } } return }