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 沒加座標範圍的閾值約束,後來發現又約束錯了,應該是 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])):
if matrix[i][j] == 0:
nabers.add((i, j))
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
LeetCode 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 注意 給定矩陣...
LeetCode 54 螺旋矩陣 中等
給定乙個包含 m x n 個元素的矩陣 m 行,n 列 請按照順時針螺旋順序,返回矩陣中的所有元素。示例 1 輸入 1,2,3 4,5,6 7,8,9 輸出 1,2,3,6,9,8,7,4,5 示例 2 輸入 1,2,3,4 5,6,7,8 9,10,11,12 輸出 1,2,3,4,8,12,11...
leetcode系列 演算法 中等 螺旋矩陣
記錄當前的迴圈次數,每迴圈一次,修改一下當前的狀態 根據當前的不同狀態,進行不同的處理遍歷方式,並將已處理的數字刪除 這樣迴圈完成一圈之後,內圈的迴圈方式,和外圈就相同了 持續迴圈到元素內的所有數字全部刪除 我設定的狀態列表如下 0 獲取當前第一行數字 1 獲取所有行的最後乙個數字 2 按照倒序獲取...