敘述
這是 Algorithm I
的第九天第一個題目,總共有兩題。
- 難度:
Medium
- 花費時間: 4 hr
- 題目
給你一個 MxN binary matrix
mat
,返回一個 MxN matrix
計算每個非零的值跟最近的零的距離,然後取代在他的值上。
上下左右才算相鄰,側面的就算要走兩格了。
點我開啟限制與範例
限制:
m == mat.length
n == mat[i].length
1 <= m, n <= 104
1 <= m * n <= 104
mat[i][j]
is either0
or1
.- There is at least one
0
inmat
.
Example 1:
1 | Input: mat = [[0,0,0],[0,1,0],[0,0,0]] |
Example 2:
1 | Input: mat = [[0,0,0],[0,1,0],[1,1,1]] |
點我開啟思路
思路
=下面的 iterative 方法宣告失敗
此方法最終會失敗是因為運算時間過久 time out
- 最大有可能有多少數字就運算幾次 (m + n -2)
- 遍歷矩陣
- 遇到 1 就進入 search 函式
- 重複做到完,就完成了
search 函式
- 找這個 node 的鄰居(上下左右),全部塞進一個陣列裡
- 比較這個陣列,找出最小值 + 1 放回節點
matrix
會一直被迭代,越來越趨近於答案,如下範例
// 原 input |
失敗的程式碼
1 | function updateMatrix(mat: number[][]): number[][] { |
=下面的 bfs 方法宣告失敗
此方法最終會失敗是因為運算時間過久 time out
- 遍歷矩陣
- 遇到 0 跳過
- 遇到 1 進入 bfs 函式
- 全部走完回傳原矩陣
bfs 函式
- 從頭開始一圈一圈往外走
- 有遇到 0 就跳出函式
- 沒遇到 0 就繼續往外圈走
失敗的程式碼記錄
1 | function updateMatrix(mat: number[][]): number[][] { |
=下面的 dfs 方法宣告失敗
- 遍歷矩陣
- 遇到 0 跳過
- 遇到 1 進入 bfs 函式
- 全部走完回傳原矩陣
dfs 函式
- 不能走走過的
- 只要最後有走到 0 的都比大小,取最小的
- 更新值
失敗的程式碼記錄
1 | function updateMatrix(mat: number[][]): number[][] { |
筆記
自己拚了 4 個小時,最後還是看解答才寫出來,但我有寫出比較相近的版本,請看上方思路裡的 iterative 版本。
這題有兩種做法:
第一種是使用 bfs
,但是對象是 0 ,我有想過這樣做,但是沒想到好的實現方法。
第二種是使用 DP
跟我寫的版本很類似,但他好在他不用迭代出答案,他只要正向遍歷一次,反向再遍歷一次即可。
解題步驟:
- 正向遍歷一次
matrix
- 遇到 0 跳過
- 每個值都只拿自己左方及上方的值做比較,拿出最小的 + 1 放入
node.val = Math.min(top.val, left.val) + 1
- 反向遍歷一次
matrix
- 遇到 0 跳過
- 每個值都與自己下方及右方的值做比較,拿出最小的 + 1 放入
node.val = Math.min(node.val, right.val, puttom.val) + 1
範例:
// input |
程式
function updateMatrix(mat: number[][]): number[][] { |