day04 542. 01 矩陣[中等]

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章