找出矩陣中每個元素到0的最短距離

2021-10-11 09:41:55 字數 2005 閱讀 7234

給定乙個由 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。

矩陣中的元素只在四個方向上相鄰: 上、下、左、右。

這裡我們都會想到暴力列舉的方法,對矩陣中的每乙個元素進行查詢,找到此元素到0的最短距離。但時間複雜度為o((r*c)^2)。我們考慮使用另一種方法。通過廣度優先搜尋實現。首先說明演算法思路:

我們可以從 00 的位置開始進行 廣度優先搜尋。廣度優先搜尋可以找到從起點到其餘所有點的 最短距離,因此如果我們從 00 開始搜尋,每次搜尋到乙個 11,就可以得到 00 到這個 11 的最短距離,也就離這個 11 最近的 00 的距離了(因為矩陣中只有乙個 00)。

舉個例子,如果我們的矩陣為:

其中只有乙個 0,剩餘的 1 我們用短橫線表示。如果我們從 00 開始進行廣度優先搜尋,那麼結果依次為:

也就是說,在廣度優先搜尋的每一步中,如果我們從矩陣中的位置 x 搜尋到了位置 y,並且 y 還沒有被搜尋過,那麼位置 y 離 0 的距離就等於位置 x 離 0的距離加上1。

對於實際的問題,矩陣中有很多的0,我選擇用多源點廣度優先的方法。設定乙個超級源點s指向所有的0,如圖:

那麼我們演算法的第一步,便是從超級源點出發,同時到達所有的0,第二步,擴充套件0的上下左右,把非0的位置設為1(此時距離0點的位置一定為1),如何達到同時的效果呢?在搜尋的時候使用佇列,第一次把搜尋到的距離0為1的點加入佇列。再出佇列以此為基點進行搜尋,把找到的非0點的距離賦值為此基點的距離+1。

我們需要用到兩個輔助矩陣

乙個seen用來儲存此元素是否被找到過

另乙個為dist儲存該點到0的距離(若該點是0,距離也為0)

看一下**:

class

solution,,

,};//分別代表上下左右方向

public

int[

]updatematrix

(int

matrix));

seen[i]

[j]=

true;}

}}// 廣度優先搜尋

while

(!queue.

isempty()

));//把搜尋到的此節點在加入佇列

seen[ni]

[nj]

=true

;//標誌此節點為ture}}

}return dist;

}}

廣度優先的演算法並不困難,思想也比較好理解,再回顧一下過程

首先找到所有0節點,加入佇列

進行廣度優先第一輪,找到周圍所有的非零節點,將其設為1

同時找到的1節點入佇列,以此為基,找到的新節點在此基礎上距離加1

直到搜尋完成。

找出陣列中重複的元素

方法一 使用位圖法,再申請乙個陣列b,用b a i 儲存a i 的重複次數 方法二 使用map對映表。map是乙個容器。第乙個元素為關鍵字key,第二個元素為關鍵字的值。這裡是map的基本用法 include include using namespace std bool findmostfreq...

matlab中矩陣元素的比較

matlab中的的最大值和最小值 matlab提供的求資料序列的最大值和最小值的函式分別為max和min,兩個函式的呼叫格式和操作過程類似。1 求向量的最大值和最小值 求乙個向量x的最大值的函式有兩種呼叫格式,分別是 1 y max x 返回向量x的最大值存入y,如果x中包含複數元素,則按模取最大值...

矩陣中不重複的元素

乙個m n的矩陣。該矩陣的第一列是a b,a 1 b,a n 1 b 第二列是a b 1 a 1 b 1 a n 1 b 1 第m列是a b m 1 a 1 b m 1 a n 1 b m 1 a b表示a的b次方 下面是乙個4 4的矩陣 2 2 4,2 3 8,2 4 16,2 5 32 3 2 ...