1.題目描述 542. 01 矩陣
給定一個由 0 和 1 組成的矩陣,找出每個元素到最近的 0 的距離。
兩個相鄰元素間的距離爲 1 。
示例 1:
輸入:
0 0 0
0 1 0
0 0 0
輸出:
0 0 0
0 1 0
0 0 0
示例 2:
輸入:
0 0 0
0 1 0
1 1 1
輸出:
0 0 0
0 1 0
1 2 1
注意:
給定矩陣的元素個數不超過 10000。
給定矩陣中至少有一個元素是 0。
矩陣中的元素只在四個方向上相鄰: 上、下、左、右。
2.思路分析
2.1 一開始就想到了幾度空間,從0開始外圍擴散遍歷的思路,不過後來想的還是麻煩,考慮看看動態規劃能不能行。當前爲0,則爲0,當前爲1,則等於min(周圍距離)+1,這明顯是個相互依賴的問題,不是動態規劃下一步依賴上一步,而不是相互依賴的這種遞推公式。當然,幾度空間的思路也可以理解爲 dp[i, j] = 某一個已知鄰居dp + 1
2.2 另一個簡單粗暴思路就是獲取所有的0點,若當前爲1,則計算其到所有爲0的的曼哈頓距離,最小值即爲所求。
3.debug過程
3.1 沒加座標範圍的閾值約束,後來發現又約束錯了,應該是 <m 而不是<=
3.2 後來發現沒有return 值,低級錯誤
3.3 沒有注意獲取的鄰居中可能有不需要下一次賦值的點,下一次賦值的時候要刨除掉
4.運行結果
執行用時 :712 ms, 在所有 Python 提交中擊敗了57.94%的用戶
內存消耗 :17.7 MB, 在所有 Python 提交中擊敗了100.00%的用戶
5.ac代碼(python):
class Solution(object):
def updateMatrix(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: List[List[int]]
1.思路1
幾度空間的思路,先將爲0的標記,同時記錄當前被標記點的未標記鄰居,要注意去重
下一輪中遍歷上一輪的鄰居,直到不再有未標記鄰居爲止
"""
dis_matrix = []
nabers = set()
m = len(matrix)
n = len(matrix[0])
for i in range(len(matrix)):
row = []
for j in range(len(matrix[0])):
row.append(-1)
if matrix[i][j] == 0:
nabers.add((i, j))
dis_matrix.append(row)
cur_dis = 0
while len(nabers) > 0:
new_nabers = set()
for naber in nabers:
i = naber[0]
j = naber[1]
if dis_matrix[i][j] != -1:
continue
dis_matrix[i][j] = cur_dis
for point in [(-1, 0), (1, 0), (0, -1), (0, 1)]:
p = i + point[0]
k = j + point[1]
if 0<= p < m and 0<= k < n and dis_matrix[p][k] == -1:
new_nabers.add((p, k))
cur_dis += 1
nabers = new_nabers
return dis_matrix