在給定的二維二進位制陣列 a 中,存在兩座島。(島是由四面相連的 1 形成的乙個最大組。)
現在,我們可以將 0 變為 1,以使兩座島連線起來,變成一座島。
返回必須翻轉的 0 的最小數目。(可以保證答案至少是 1。)
示例 1:
輸入:[[0,1],[1,0]]
輸出:1
1 <= a.length = a[0].length <= 100
a[i][j] == 0 或 a[i][j] == 1
原題鏈結;
1、首先,先把其中的乙個小島標記為2,另外乙個小島放入到佇列中。
2、使用寬度優先搜尋,將佇列中的元素彈出,並且判斷是否與標記為2的小島相連,如果不相連,把遍歷的地方標記為1,並且壓入佇列,等待下一次遍歷搜尋。
3、把寬度優先搜尋的層數作為最短的橋。
def dfs(a, i, j):
if i<0 or i>= len(a) or j<0 or j >= len(a[0]) or a[i][j]==2 or a[i][j] == 0:
return
a[i][j] = 2
dfs(a, i-1, j)
dfs(a, i+1, j)
dfs(a, i, j-1)
dfs(a, i, j+1)
class solution:
def shortestbridge(self, a: list[list[int]]) -> int:
row = len(a)
column = len(a[0])
found = false
stack =
direction = [[-1, 0],[1,0],[0,1], [0, -1]]
for i in range(row):
for j in range(column):
if not found and a[i][j] == 1:
dfs(a, i, j)
found = true
if found and a[i][j] == 1:
# bfs
count = 0
while len(stack)>0:
for i in range(len(stack)):
[x, y] = stack.pop(0)
for [dx, dy] in direction:
nx = x + dx
ny = y + dy
if nx<0 or nx>=len(a) or ny < 0 or ny>=len(a[0]):
continue
elif a[nx][ny] == 2:
return count
elif a[nx][ny] == 1:
continue
else:
a[nx][ny] = 1
count += 1
return count
參考:
leetcode學習筆記-934-最短的橋;
LeetCode 934 最短的橋(2次BFS)
在給定的二維二進位制陣列 a 中,存在兩座島。島是由四面相連的 1 形成的乙個最大組。現在,我們可以將 0 變為 1,以使兩座島連線起來,變成一座島。返回必須翻轉的 0 的最小數目。可以保證答案至少是 1。示例 1 輸入 0 1 1,0 輸出 1 示例 2 輸入 0 1,0 0 0,0 0 0,1 ...
leetcode 字元的最短距離
題目 給定乙個字串s和乙個字元c。返回乙個代表字串s中每個字元到字串s中的字元c的最短距離的陣列。示例 1 輸入 s loveleetcode c e 輸出 3,2,1,0,1,0,0,1,2,2,1,0 說明 字串s的長度範圍為 1,10000 c是乙個單字元,且保證是字串s裡的字元。s和c中的所...
LeetCode 864 獲取所有鑰匙的最短路徑
給定乙個二維網格grid。代表乙個空房間,代表一堵牆,是起點,a b 代表鑰匙,a b 代表鎖。我們從起點開始出發,一次移動是指向四個基本方向之一行走乙個單位空間。我們不能在網格外面行走,也無法穿過一堵牆。如果途經乙個鑰匙,我們就把它撿起來。除非我們手裡有對應的鑰匙,否則無法通過鎖。假設 k 為鑰匙...