LeetCode934 最短的橋

2021-09-27 12:59:20 字數 1576 閱讀 9109

在給定的二維二進位制陣列 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 為鑰匙...