day04 542 01 矩陣 中等

2021-10-05 02:38:20 字數 1844 閱讀 2170

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 按照倒序獲取...