LeetCode BFS解決的題目

2022-07-31 13:48:16 字數 2781 閱讀 6906

一.130  surrounded regions(

題目:解法:這道題的意思是將所有被x包圍的o都變為x(邊緣的不算),我們可以維護乙個佇列,先把四周的o的位置放進佇列中,並把這個位置的值變為y。然後每次從佇列中拿出乙個位置,把這個位置四周為o的位置的值變為y,再把這個位置放進佇列(為什麼要先變值再進佇列呢?在下一道題中會說)。一直到隊列為空時,我們就成功地把所有直接或間接地與邊緣的o相連的其他o變為了y,剩餘的o就是被x包圍的了。然後遍歷一遍,把為o的位置變為x,為y的位置變為o,就得出結果了。 

這道題利用到了bfs(寬度優先搜尋)的思想,那麼用深度優先是否可以呢?據說會tle,因為圖可能很大,遞迴會導致棧溢位。但是,我認為分別用這兩種不同的方法思考一下這道題,可以鍛鍊利用bfs和dfs解題的思想。

下面是**:

class

solution }}

while (!x.empty() && !y.empty())

if (i + 1

< board.size() && board[i + 1][j] == 'o'

)

if (j - 1 >= 0 && board[i][j - 1] == 'o'

)

if (j + 1

< board[0].size() && board[i][j + 1] == 'o'

) }

for (int i = 0; i < board.size(); i++)

else}}

}};

二. 200  number of islands(

題目:解法:這道題的基本思想跟上面一道差不多,也是用bfs,維護乙個佇列:

當遇到1的時候,把它改為0,進佇列;(每次遇到新的island時)

每次把乙個位置出佇列,並把這個位置四周為1的位置改為0,然後把這些位置放入佇列中。當隊列為空時,代表已經找到乙個island的所有1了,結果+1。

解法是簡單的,但我做題的時候還是踩了不少坑:

(1)我用了三層迴圈去寫,因為我想著要判斷什麼時候所有位置都為0,但其實是多此一舉,只需要遍歷每乙個位置就行了。

(2)我一開始是先把位置放進佇列,在出佇列的時候才把這個位置的值變為0,但這是不對的:這樣會造成乙個位置的多次進佇列(細想一下吧,出佇列的時候才變為0,那在進佇列到出佇列的過程中這個位置的值還是1,還是會被其他位置檢測到,多次加進佇列),肯定會tle。因此一定要先把值變為0,再加進佇列。

**如下:

class

solution

if (i + 1

< grid.size() && grid[i + 1][j] == '1'

)

if (j - 1 >= 0 && grid[i][j - 1] == '1'

)

if (j + 1

< grid[0].size() && grid[i][j + 1] == '1'

) }

ans++;}}

}return

ans;}};

或者:

class

solution }}

return

ans;

}void bfs(vectorchar> >& grid, int i, int

j)

if (i + 1

< grid.size() && grid[i + 1][j] == '1'

)

if (j - 1 >= 0 && grid[i][j - 1] == '1'

)

if (j + 1

< grid[0].size() && grid[i][j + 1] == '1'

) }

};

三.542 01 matrix

題目:

解法:

**:

class

solution

else}}

while (!x.empty() && !y.empty())

if (i + 1

< ans.size() && ans[i + 1][j] == -1

)

if (j - 1 >= 0 && ans[i][j - 1] == -1

)

if (j + 1

< ans[0].size() && ans[i][j + 1] == -1

) }

return

ans;}};

2018.1.7補充:

上面這一題,重做了一下,想到乙個問題: 為什麼可以不判斷一下就直接ans[i][j] + 1呢?

題目要求離最近的0的距離,而bfs是一層層疊加的、從小到大的,在if處加了ans[i + 1][j] == -1的判斷,說明要已修改的值是不能再修改的,滿足離最近的0的距離的要求。(描述得不是很清楚,不過自己能回想起就對了)

leetcode上面還有其他一些用bfs解決的問題,比如word ladder,但在前面已經寫過了。

leetcode BFS求解的幾道題

題目 在乙個 n n 的方形網格中,每個單元格有兩種狀態 空 0 或者阻塞 1 返回這條從左上角到右下角的最短暢通路徑的長度。如果不存在這樣的路徑,返回 1 設 d id i di 表示第 i 個節點與根節點的距離,推導出乙個結論 對於先遍歷的節點 i 與後遍歷的節點 j,有 di dj d i l...

LeetCode BFS 刪除無效的括號

刪除最小數量的無效括號,使得輸入的字串有效,返回所有可能的結果。說明 輸入可能包含了除 和 以外的字元。示例 輸入 輸出 輸入 a 輸出 a a 輸入 輸出 class solution if isvalid s return queueq unordered setlookup 記錄字串是否被訪問...

使用bit map可以解決的題

來自於 程式設計珠璣 所謂的bit map就是用乙個bit位來標記某個元素對應的value,而key即是該元素。由於採用了bit為單位來儲存資料,因此在儲存空間方面,可以大大節省。如果說了這麼多還沒明白什麼是bit map,那麼我們來看乙個具體的例子,假設我們要對0 7內的5個元素 4,7,2,5,...