题意:
解题思路:
思路:
1.初始化第一行,第一列没有0
2.如果第一行,第一列有0,则标记
3.除了第一行,第一列外的元素如果有0,则把对应的行,列首位置,置为0作为标志位
=》matrix[i][0] = 0;matrix[0][j] = 0
4.再把上面标志位对应的行列全部置为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
}