- 73.矩阵置零
m*n
额外空间m+n
额外空间- 两个标记变量额外空间
- 一个标记变量额外空间
进阶:
- 一个直观的解决方案是使用
O(m*n)
的额外空间,但这并不是一个好的解决方案。 - 一个简单的改进方案是使用
O(m+n)
的额外空间,但这仍然不是最好的解决方案。 - 你能想出一个仅使用常量空间的解决方案吗?
矩阵置零 - m*n
额外空间
func setZeroes(matrix [][]int) {
m := len(matrix)
if m == 0 {
return
}
n := len(matrix[0])
hasZero := [][2]int{}
for i := 0; i < m; i++ {
for j := 0; j < n; j++ {
if matrix[i][j] == 0 {
hasZero = append(hasZero, [2]int{ i, j })
}
}
}
for _, v := range hasZero {
setZero(matrix, v[0], v[1])
}
}
func setZero(matrix [][]int, m, n int) {
for i := range matrix[m] {
matrix[m][i] = 0
}
for i := 0; i < len(matrix); i++ {
matrix[i][n] = 0
}
}
矩阵置零 - m+n
额外空间
func setZeroes(matrix [][]int) {
m := len(matrix)
if m == 0 {
return
}
n := len(matrix[0])
hasZero := [2][]bool{}
hasZero[0] = make([]bool, m)
hasZero[1] = make([]bool, n)
for i := 0; i < m; i++ {
for j := 0; j < n; j++ {
if matrix[i][j] == 0 {
hasZero[0][i] = true
hasZero[1][j] = true
}
}
}
setZero(matrix, hasZero)
}
func setZero(matrix [][]int, hasZero [2][]bool) {
for m, has := range hasZero[0] {
if !has {
continue
}
for i := range matrix[m] {
matrix[m][i] = 0
}
}
for n, has := range hasZero[1] {
if !has {
continue
}
for i := 0; i < len(matrix); i++ {
matrix[i][n] = 0
}
}
}
矩阵置零 - 使用两个标记变量
func setZeroes(matrix [][]int) {
m := len(matrix)
if m == 0 {
return
}
n := len(matrix[0])
mHasZero, nHasZero := false, false
for i := range matrix {
if matrix[i][0] == 0 {
mHasZero = true
break
}
}
for i := 0; i < n; i++ {
if matrix[0][i] == 0 {
nHasZero = true
break
}
}
for i := 1; i < m; i++ {
for j := 1; j < n; j++ {
if matrix[i][j] == 0 {
matrix[0][j] = 0
matrix[i][0] = 0
}
}
}
for i := 1; i < m; i++ {
for j := 1; j < n; j++ {
if matrix[0][j] == 0 || matrix[i][0] == 0 {
matrix[i][j] = 0
}
}
}
if mHasZero {
for _, v := range matrix {
v[0] = 0
// matrix[i][0] = 0
}
}
if nHasZero {
for i := 0; i < n; i++ {
matrix[0][i] = 0
}
}
}
矩阵置零 - 使用一个标记变量
func setZeroes(matrix [][]int) {
m := len(matrix)
if m == 0 {
return
}
n := len(matrix[0])
mHasZero := false
for i := 0; i < m; i++ {
if matrix[i][0] == 0 {
mHasZero = true
}
for j := 1; j < n; j++ {
if matrix[i][j] == 0 {
matrix[0][j] = 0
matrix[i][0] = 0
}
}
}
for i := m - 1; i >= 0; i-- {
for j := 1; j < n; j++ {
if matrix[0][j] == 0 || matrix[i][0] == 0 {
matrix[i][j] = 0
}
}
if mHasZero {
matrix[i][0] = 0
}
}
}