bfs演算法框架
bfs的核心思想,就是把一些問題抽象成圖,從乙個節點開始,向四周擴散。一般來說,寫bfs都是用[佇列]這個資料結構,每次將乙個節點周圍的節點加入到隊尾。
先舉例⼀下 bfs 出現的常⻅場景好吧,問題的本質就是讓你在⼀幅「圖」 中找到從起點 start 到終點 target 的最近距離, 這個例⼦聽起來很枯燥, 但是 bfs 演算法問題其實都是在⼲這個事⼉, 把枯燥的本質搞清楚了, 再去欣賞各種問題的包裝才能胸有成竹嘛。
這些問題都沒啥奇技淫巧, 本質上就是⼀幅「圖」 , 讓你從⼀個起點, ⾛到終點, 問最短路徑。 這就是 bfs 的本質,框架搞清楚了直接默寫就好。
bfs框架:
int bfs(node start, node target)}}
// 劃重點,更新步數在這裡
step++;
}}
其中,cur.adj()
表示節點cur
的相鄰節點(圖即鄰接點,樹即子節點)。
經典例題一:二叉樹的最小高度(leetcode.111)
怎麼套到 bfs 的框架⾥呢?⾸先明確⼀下起點 start 和終點 target 是什麼,怎麼判斷到達了終點?顯然起點就是 root 根節點, 終點就是最靠近根節點的那個「葉⼦節點」嘛, 葉⼦節點就是兩個⼦節點都是 null 的節點:
if(cur->left == nullprt && cur->right == nullptr)
//到達葉子結點,返回
那麼,按照bfs框架稍加改造:#include /**
* definition for a binary tree node.
* struct treenode
* };
*/class solution
// 劃重點,更新步數在這裡
depth++;
}return depth;
}};
經典例題二:開啟轉盤鎖(leetcode.752)
直接上**:
#include #include class solution
// 將s[i]向下撥
string minusone(string s, int i)
int bfs(vector&deadends, string target)
// 將該結點的所有子節點加入隊尾
for(int i = 0; i < 4; i++)
if(visited.find(adjminus) == visited.end())}}
step++;
}return -1;
}int openlock(vector& deadends, string target)
};
BFS 演算法解題套路框架
bfs 的核心思想應該不難理解的,就是把一些問題抽象成圖,從乙個點開始,向四周開始擴散。一般來說,我們寫 bfs 演算法都是用 佇列 這種資料結構,每次將乙個節點周圍的所有節點加入佇列。特點 bfs 找到的路徑一定是最短的,但代價就是空間複雜度可能比 dfs 大很多 問題的本質就是讓你在一幅 圖 中...
BFS 廣度搜尋 演算法框架
一般bfs和資料結構中的佇列聯絡比較緊密 1.演算法框架 計算的是迷宮,從起點出發,到達終點,走的步數。計算從起點 start 到終點 target 的最近距離 intbfs node start,node target 劃重點 更新步數在這裡 step 2.二叉樹的最小高度 套模板 二叉樹的最小深...
廣度優先搜尋BFS框架
廣度優先搜尋與深度優先搜尋是兩種不同的搜尋方式。比如回答從地圖上的某點到另外一點是否可達,一般可以採用深搜。而問從某點到另外點的最短路徑長度可以採用廣度搜尋,因為在有解的前提下,廣度優先搜尋是按層遍歷的,可以保證到達解時所用的路徑最短。下面的例子是抓住那頭牛的ac 使用了廣度優先搜尋的方法解題。in...