链接
题目.
难度:
middle
解答:
要想不使用额外空间,那么就需要将标志位设在原来的数据上面,这里就把第一行和第一列用来存储改行或者该列是否有0 的标志,这样原来是否是0就被覆盖了,所以需要两个标志记录下来
package main
import "fmt"
func setZeroes(matrix [][]int) {
if len(matrix) == 0 {
return
}
rows, cols := len(matrix), len(matrix[0])
rowZero, colZero := false, false
for i := 0; i < rows; i++ {
if matrix[i][0] == 0 {
rowZero = true
break
}
}
for j := 0; j < cols; j++ {
if matrix[0][j] == 0 {
colZero = true
break
}
}
for i := 1; i < rows; i++ {
for j := 1; j < cols; j++ {
if matrix[i][j] == 0 {
matrix[i][0] = 0
matrix[0][j] = 0
}
}
}
for i := 1; i < rows; i++ {
if matrix[i][0] == 0 {
for j := 1; j < cols; j++ {
matrix[i][j] = 0
}
}
}
for j := 1; j < cols; j++ {
if matrix[0][j] == 0 {
for i := 1; i < rows; i++ {
matrix[i][j] = 0
}
}
}
if rowZero {
for i := 0; i < rows; i++ {
matrix[i][0] = 0
}
}
if colZero {
for j := 0; j < cols; j++ {
matrix[0][j] = 0
}
}
}
func main() {
matrix := [][]int{
{0, 1, 2, 0},
{3, 4, 5, 2},
{1, 3, 1, 5},
}
setZeroes(matrix)
fmt.Println(matrix)
}
复杂度分析
time
O(m*n)
space
O(1)
执行结果
执行用时 :
32 ms
, 在所有 golang 提交中击败了
6.45%
的用户
内存消耗 :
6.1 MB
, 在所有 golang 提交中击败了
100.00%
的用户