摘要:本文為大家分享兩個常見的搜尋演算法:bfs和dfs。本次分享兩個常見的搜尋演算法:
1.bfs 即廣度優先搜尋
2.dfs 即深度優先搜尋
給定乙個由 『1』(陸地)和 『0』(水)組成的的二維網格,計算島嶼的數量。乙個島被水包圍,並且它是通過水平方向或垂直方向上相鄰的陸地連線而成的。你可以假設網格的四個邊均被水包圍。
示例 1:
1111011010
11000
00000
輸出: 1
示例 2:
1100011000
00100
00011
輸出: 3
其實我們還是比較容易想到初步解法的,即從二維網路某點出發,尋找其四周相鄰的陸地,直到所有包含的點都沒有相鄰的陸地為止,這裡可以認為已經找到了乙個島嶼,其餘島嶼同理可以找到。這裡的關鍵問題是遍歷島嶼的順序,其實不難看出有兩種順序
a.優先尋找某a節點的所有相鄰位置
然後拿出乙個相鄰位置比如說b尋找其所有相鄰位置
拿出a節點下乙個相鄰位置重複第2步直到a節點的相鄰位置都執行過該操作
拿出b,重複1,2,3步
b.優先尋找a節點的相鄰位置比如說b
尋找b的相鄰位置c
直到沒有相鄰位置後再返回到a的下乙個相鄰位置,重複1,2步
我們對第一種方法進行觀察:
越是接近根結點的結點將越早地遍歷
思考用什麼儲存結構來存放我們找到的位置:我們把root的相鄰位置儲存到x結構中,然後取出x的某個相鄰位置a,尋找其相鄰位置繼續存放到x中,再取出x中與root相鄰的下個位置b繼續尋找其相鄰位置放入x中。這裡我們發現我們儲存x的順序與我們處理x得到其他資料的順序一致:先進先出(fifo),不難得出我們可以採用佇列來儲存
需要一種方法避免對已經找到的位置重複訪問
現在可以嘗試寫出實際的程式
publicint numislands(char
grid)
queue
queue = new linkedlist<>();
int count =0
;
for(int y=0;y)
queue.poll();
}count++;
}//核心部分
} }
通過這個例項我們可以進一步抽象為圖論中的一種演算法–bfs
可以參考leetcode的**和演算法模板來加深印象
同樣來觀察第二中方法,我們發現
優先走完一條路徑直到結束
我們需要在某一路徑結束後,回溯到初始位置,即儲存節點位置的順序和處理的順序相反,即現進後出(filo)。這裡我們可以用遞迴或者棧來處理。
試著寫出實際的程式
publicint numislands(char
grid) }}
return
len;
}boolean dfs(integer cur, set
visited,char
grid)
}return
true
; }
boolean dfs3(integer cur, setvisited,chargrid)
}//如果當前節點沒有鄰居則去除棧頂節點
if(!hasnearnode)
}return
true
; }
通過這個例項我們可以進一步抽象為圖論中的一種演算法–dfs
參考leetcode的**和模板演算法(遞迴和棧)來加深印象
點選關注,第一時間了解華為雲新鮮技術~
搜尋演算法(DFS和BFS)
題目 有n件物品,每件物品的重量為w i 價值為c i 現在需要選出若干物品放入乙個容器為v的揹包中,使得在選入揹包的物品重量和不超過容量v的前提下,讓揹包中物品的價值之和最大,求最大價值。1 n 20 解題 如下 includeconst int maxn 30 int n,v,maxvalue ...
一文弄懂搜尋演算法中的DFS和BFS
有一位小夥伴問我,迷宮問題怎麼解決,我說dfs或者bfs,然後,ta說,哦哦,這我知道,就是圖裡面的演算法嘛,但,這是個迷宮,難道我要把這個二維矩陣變成圖嘛?我 當場去世。於是我開啟了我的長篇大論。希望大家有所收穫。首先,回答一下那位小夥伴的問題,這個演算法確實屬於圖裡面的演算法,但並不是說是專門針...
樹的直徑(兩個bfs)
樹的直徑 樹中的最長鏈 具體思路 隨便找乙個點bfs,然後找到最長的鏈,然後再以找到的點作為起點進行bfs,然後找到的最長的鏈就是樹的直徑。ac include include include include include include include include include inclu...