前往
大廳
主題

LeetCode - 542. 01 Matrix 解題心得

Not In My Back Yard | 2021-11-23 00:00:01 | 巴幣 10 | 人氣 879

題目連結:


題目意譯:
給定一個 m × n 二元矩陣 mat,回傳每個格子離最近的 0 之距離。

兩個相鄰格子的距離為 1。

限制:
m == mat.length
n == mat[i].length
1 ≦ m 、 n ≦ 10 ^ 4
1 ≦ m × n ≦ 10 ^ 4
mat[i][j] 只會是 0 或是 1。
mat 中至少會有一個 0。



範例測資:
範例 1:
輸入: mat = [[0,0,0],[0,1,0],[0,0,0]]
輸出: [[0,0,0],[0,1,0],[0,0,0]]

範例 2:
輸入: mat = [[0,0,0],[0,1,0],[1,1,1]]
輸出: [[0,0,0],[0,1,0],[1,2,1]]


解題思維:
定義一個二維陣列 D,其中 D[i][j] 代表著第 i 列第 j 行距離最近的 0 有多遠(索引值從 0 開始)。如同其他動態規劃(Dynamic Programming)之題目,我們可以列出其遞迴式:
當 mat[i][j] = 0,D[i][j] = 0;
當 mat[i][j] ≠ 0,D[i][j] = min(D[i-1][j], D[i][j-1], D[i+1][j], D[i][j+1]) + 1。

其中第二列的遞迴式即代表著第 i 列第 j 行的最短距離肯定來自於其上下左右之相鄰格子的最短距離值 + 1。而當中上與下、左與右是同時求時會互相衝突的方向。

不過我們其實可以看到當最小值來自於左或上時,本身的值將不會是左或上的「最小值來源」(對於左或上之位置該格為右或下);反之亦然。也就是說「左上」以及「右下」兩個方向是可以分開並獨立的。

所以將上下左右分成「左上」、「右下」(或是「左下」、「右上」也可以),然後我們像其他動態規劃題一般從左上跑到右下求出每個位置 D[i-1][j](來自於上)、 D[i][j-1](來自於左)兩個方向。接著再從右下跑回左上,求出每個每個位置 D[i+1][j](來自於下)、 D[i][j+1](來自於右)兩方向。結束後便求出整個版面的所求距離值。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作