演算法過程:
1.首先將根節點放入佇列中
2.從佇列中取出第乙個節點,進行訪問,並將其所有未訪問過的鄰居加入佇列彙總
3.若隊列為空,則演算法結束
時間複雜度
不確定,|v|代表節點數量,|e|代表邊的數量
鄰接表表示時,查詢所有頂點的鄰接點所需時間為o(|e|),訪問頂點的鄰接點所花時間為o(|v|),總的時間複雜度為o(|v|+|e|)
鄰接矩陣表示時,查詢每個頂點的鄰接點所需時間為o(|v|),要查詢整個矩陣,故總的時間度為o(|v|^2)
給定正整數n,找到若干個完全平方數(比如1,4,9,16,…)使得他們的和等於n,你需要讓組成和的完全平方數的個數最少。
示例1輸入n= 12
輸出3解釋 12= 4+4+4
示例2輸入 n= 13
輸出2解釋 13 = 4+9
對問題建模:
整個問題轉化為乙個圖論問題。
從n到0,每個數字表示乙個節點;
如果兩個數字x到y相差乙個完全平方數,則連線一條邊。
我們得到乙個無權圖。
原問題轉化成,求這個無權圖中從n到0的最短路徑
比如 4->3->2->1->0
4->0
class
node()
:def
__init__
(self,value,passed =0)
: self.val = value
self.passed = passed
class
solution()
:def
numsquares
(self,n)
:# 根節點放入佇列中
queue =
[node(n)
] visited =[0
]*n+[1
]while queue:
x = queue.pop(0)
i =1while
true
: temp = x.val - i*i
if temp<0:
break
if temp ==0:
return x.passed+1if
not visited[temp]:1
))visited[temp]=1
i +=
1
演算法過程(非遞迴):
1.首先將根節點放入stack中
2.從stack中取出第乙個節點進行訪問,將它某乙個未訪問過的鄰居加入stack中
3.重複2
4.如果不存在未訪問過的鄰居,將上一級節點加入stack中,重複步驟2
5.若stack為空,表示遍歷結束
遞迴:遞迴終止條件:所有鄰居都被訪問過或者找到需要尋找的節點
遞迴過程:對當前節點的所有未被訪問過的鄰居進行遞迴
時間複雜度與bfs相同
給定乙個包含了一些0 1的費控二維陣列grid,乙個島嶼是由四個方向(水平或垂直)的1(表示土體)構成的組合。你可以假設二維陣列矩陣的四個邊緣都被水包圍著。
找到給定的二維陣列中最大的島嶼面積(如果沒有,則返回面積為0)
[[0,0,1,0,0,0,0,1,0,0,0,0,0],
[0,0,0,0,0,0,0,1,1,1,0,0,0],
[0,1,1,0,1,0,0,0,0,0,0,0,0],
[0,1,0,0,1,1,0,0,1,0,1,0,0],
[0,1,0,0,1,1,0,0,1,1,1,0,0],
[0,0,0,0,0,0,0,0,0,0,1,0,0],
[0,0,0,0,0,0,0,1,1,1,0,0,0],
[0,0,0,0,0,0,0,1,1,0,0,0,0]]
對於上面給定矩陣應返回6,不是11
分析:圖中的每塊陸地(標誌為1的地方)都可以當做乙個節點,兩個1上下貨左右相連視為一條邊
那麼二維陣列可以建模成很多圖
對二維陣列進行遍歷,如果是1,則執行圖的基礎遍歷演算法dfs(bfs),並記錄訪問標誌
注意:在dfs或者bfs中都要注意,當乙個子圖遍歷完成後檢查是否還有未訪問節點,並隨機選擇未訪問節點進行遍歷。
class
solution
:def
maxareaofisland
(self,grid):if
len(grid)==0
:return
0 row , column =
list
.en(grid[0]
),len(grid)
visited =[[
0]*row for _ in
range
(column)
] r =
0for i in
range
(column)
:for j in
range
(row)
:if visited[i]
[j]==
0and grid[i]
[j]==1:
# 向下向左右
area =[0
] self.dfs(i,j,grid,visited,area)
if r : r = area[0]
return r
defdfs(self,i,j,grid,visited,area)
:if i<
0or i >=
len(grid)
or j<
0or j >=
len(grid[0]
):return
if grid[i]
[j]==
0or visited[i]
[j]==1:
return
visited[i]
[j]=
1 area[0]
+=1self.dfs(i-
1,j,grid,visited,area)
self.dfs(i+
1,j,grid,visited,area)
self.dfs(i, j-
1, grid, visited, area)
self.dfs(i, j+
1, grid, visited, area)
DFS和BFS演算法
本質區別 bfs 的重點在於佇列,而 dfs 的重點在於遞迴。這是它們的本質區別。dfs 演算法 是一種利用遞迴 實質上是用棧來儲存未訪問的結點,先進後出 實現的搜尋演算法,直到找到解或走不下去為止。簡單來說,其搜尋過程和 不撞南牆不回頭 樹的先序遍歷 類似。bfs演算法 是一種利用佇列 用佇列來儲...
DFS和BFS演算法
一 深度優先遍歷 深度優先搜尋,是圖論中的經典演算法。其利用深度優先搜尋演算法可以產生目標圖的相應拓撲排序表,利用拓撲排序表可以方便的解決很多相關的圖論問題,如最大路徑問題等等。遞迴定義 圖的深度優先遍歷類似於樹的前序遍歷。採用的搜尋方法的特點是盡可能先對縱深方向進行搜尋。這種搜尋方法稱為深度優先搜...
演算法 dfs和bfs的演算法實現
bfs主要應用於連通圖的遍歷,它的核心思想是從乙個頂點開始,輻射狀地優先遍歷其周圍較廣的區域,即逐層遍歷,bfs最經典的應用場景為最短路徑,很多最短路徑演算法都是基於bfs實現,bfs通常基於佇列的思想實現,其實現過程如下 1 頂點入佇列 2 隊列為空,演算法結束,佇列非空,演算法繼續執行 3 出佇...