給定乙個 m x n 的矩陣,如果乙個元素為 0,則將其所在行和列的所有元素都設為 0。請使用原地演算法。
示例 1:
輸入:[
[1,1,1],
[1,0,1],
[1,1,1]
]輸出:
[[1,0,1],
[0,0,0],
[1,0,1]
]示例 2:
輸入:[
[0,1,2,0],
[3,4,5,2],
[1,3,1,5]
]輸出:
[[0,0,0,0],
[0,4,5,0],
[0,3,1,0]
]高階:
乙個直接的解決方案是使用 o(mn) 的額外空間,但這並不是乙個好的解決方案。
乙個簡單的改進方案是使用 o(m + n) 的額外空間,但這仍然不是最好的解決方案。
你能想出乙個常數空間的解決方案嗎?
空間複雜度為o(mn)的解決方案是用與原陣列大小相同的來mark或者set_zeros,很容易實現。而o(m + n)的解決方案是用乙個rows[n]的陣列來標記哪些行該置為0,用cols[m]陣列標記哪些列該置為0。
原地操作的方法沒想到,參考的是官方題解。
先遍歷一次矩陣,若matrix[i][j] = 0,則直接將matrix[i][0]和matrix[0][j]置為0。這樣做只是用遍歷過的元素做標記,不會影響後面元素,很靈性的乙個做法。當然,這樣直接操作會帶來乙個問題,當第一行或第一列有元素為0,都會使matrix[0][0]=0,不能區分對第一行和第一列進行區分,需要用到乙個標記來區分。
最後對第一行和第一列的元素進行遍歷,具體操作依據下面公式:
matrix[i][j] = 0&(i\geq0& and&i\leq n)&if&matrix[0][j]=0(j \neq 0)\\ matrix[i][j] = 0&(j\geq0&and&j\leq m)&if&matrix[i][0]=0\\ matrix[i][0] = 0&(i\geq0&and&i\leq n)&if&flag\_first\_col=true \end
⎩⎪⎨⎪⎧
matr
ix[i
][j]
=0ma
trix
[i][
j]=0
matr
ix[i
][0]
=0(
i≥0(
j≥0(
i≥0
anda
ndan
di≤
n)j≤
m)i≤
n)i
fifi
fma
trix
[0][
j]=0
(j
=0)m
atri
x[i]
[0]=
0fla
g_fi
rst_
col=
true
/*
時間複雜度為o(mn)
力扣 73 矩陣置零
給定乙個 m x n 的矩陣,如果乙個元素為 0 則將其所在行和列的所有元素都設為 0 請使用 原地 演算法。高階 乙個直觀的解決方案是使用 o mn 的額外空間,但這並不是乙個好的解決方案。乙個簡單的改進方案是使用 o m n 的額外空間,但這仍然不是最好的解決方案。你能想出乙個僅使用常量空間的解...
73 矩陣置零
方法1 賦值另存乙個m n的矩陣,在原矩陣為零的值相應置新的矩陣行和列為零。額外空間為o m n o m n o m n 方法2 兩個陣列,bool m 和 bool n 分別存某行有零,後者某列有零。之後根據陣列值將原矩陣相應位置置零。額外空間o m n o m n o m n 方法3 看來許久才...
73 矩陣置零
題目.middle 要想不使用額外空間,那麼就需要將標誌位設在原來的資料上面,這裡就把第一行和第一列用來儲存改行或者該列是否有0 的標誌,這樣原來是否是0就被覆蓋了,所以需要兩個標誌記錄下來 package main import fmt func setzeroes matrix int rows...