力扣 DFS BFS专题
111. 二叉树的最小深度
https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/
关键在于知道f(root)=min(f(left),f(right))+1这个表达式
class Solution {
public:
int minDepth(TreeNode* root) {
if(!root) return 0;
int left=minDepth(root->left);
int right=minDepth(root->right);
if(!left || !right) return left+right+1;
return min(left,right)+1;
}
};
279. 完全平方数
https://leetcode-cn.com/problems/perfect-squares/
经典BFS
class Solution {
public:
typedef struct {
int num;
int temp;
}Num;
int numSquares(int n) {
queue<Num> q;
Num q1,q2;
q1.num=0;
q1.temp=0;
int vis[10005]={0};
vis[0]=1;
q.push(q1);
while(!q.empty()){
q1=q.front();
q.pop();
if(q1.num==n) return q1.temp;
int x=q1.num;
for(int i=1;x+i*i<=n;i++){
int j=x+i*i;
if(!vis[j]){
q2.num=j;
q2.temp=q1.temp+1;
vis[j]=1;
q.push(q2);
}
}
}
return 0;
}
};
733. 图像渲染
https://leetcode-cn.com/problems/flood-fill/
class Solution {
public:
vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int newColor) {
if(image.empty() || image[0].empty()) return image;
int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
int old=image[sr][sc];
if(old==newColor){
//重新走了已经遍历的地方
return image;
}
image[sr][sc]=newColor;
for(int i=0;i<4;i++){
int x=sr+dx[i],y=sc+dy[i];
if(x>=0 && x<image.size() && y>=0 && y<image[0].size() && image[x][y]==old){
floodFill(image,x,y,newColor);
}
}
return image;
}
};
200. 岛屿数量
https://leetcode-cn.com/problems/number-of-islands/
class Solution {
public:
int vis[305][305]={0};
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
void dfs(int x,int y,vector<vector<char>>& grid){
for(int i=0;i<4;i++){
int nx=x+dx[i],ny=y+dy[i];
if(nx>=0 && nx<grid.size() && ny>=0 && ny<grid[0].size() && !vis[nx][ny] && grid[nx][ny]=='1'){
grid[nx][ny]='0';
vis[nx][ny]=1;
dfs(nx,ny,grid);
}
}
}
int numIslands(vector<vector<char>>& grid) {
int ans=0;
for(int i=0;i<grid.size();i++){
for(int j=0;j<grid[0].size();j++){
if(grid[i][j]=='1'){
grid[i][j]='0';
vis[i][j]=1;
ans++;
dfs(i,j,grid);
}
}
}
return ans;
}
};
130. 被围绕的区域
https://leetcode-cn.com/problems/surrounded-regions/
从边界的O出发DFS,所有没被打上标记的即被包围的
class Solution {
public:
int vis[205][205]={0};
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
void dfs(int x,int y,vector<vector<char>>& board){
int n=board.size(),m=board[0].size();
for(int i=0;i<4;i++){
int nx=x+dx[i],ny=y+dy[i];
if(nx>=0 && nx<n && ny>=0 && ny<m && !vis[nx][ny] && board[nx][ny]=='O'){
vis[nx][ny]=1;
dfs(nx,ny,board);
}
}
}
void solve(vector<vector<char>>& board) {
if(board.empty() || board[0].empty()) return ;
int n=board.size(),m=board[0].size();
for(int i=0;i<n;i++){
//扫描最左边和最右边
if(board[i][0]=='O'){
vis[i][0]=1;
dfs(i,0,board);
}
if(board[i][m-1]=='O'){
vis[i][m-1]=1;
dfs(i,m-1,board);
}
}
for(int j=0;j<m;j++){
//扫描最上面和最下面
if(board[0][j]=='O'){
vis[0][j]=1;
dfs(0,j,board);
}
if(board[n-1][j]=='O'){
vis[n-1][j]=1;
dfs(n-1,j,board);
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(!vis[i][j]){
board[i][j]='X';
}
}
}
}
};
543. 二叉树的直径
https://leetcode-cn.com/problems/diameter-of-binary-tree/
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int ans=0;
int diameterOfBinaryTree(TreeNode* root) {
dfs(root);
return ans;
}
int dfs(TreeNode* root){
if(!root) return 0;
int left=dfs(root->left),right=dfs(root->right);
ans=max(ans,left+right);
return max(left,right)+1;
}
};
127. 单词接龙
https://leetcode-cn.com/problems/word-ladder/
class Solution {
public:
int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
unordered_set<string>S;
for(auto s:wordList){
S.insert(s);
}
unordered_map<string,int>dist;
dist[beginWord]=0;
queue<string>q;
q.push(beginWord);
while(!q.empty()){
auto x=q.front();
q.pop();
if(x==endWord) return dist[x]+1;
string r=x;//保存当前字符串
for(int i=0;i<x.size();i++){
x=r;//记得重新赋值回来
for(char j='a';j<='z';j++){
//每次变更一个字符
x[i]=j;
if(S.count(x) && !dist.count(x)){
//如果变出来的字符串在WordList里 并且之前没有出现过
dist[x]=dist[r]+1;
q.push(x);
}
}
}
}
return 0;
}
};
542. 01 矩阵
https://leetcode-cn.com/problems/01-matrix/
将所有的0加入队列,同时进行BFS就是答案
#define x first
#define y second
class Solution {
public:
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
if(matrix.empty() || matrix[0].empty()) return matrix;
int n=matrix.size(),m=matrix[0].size();
vector<vector<int>> dist(n,vector<int>(m,-1));
typedef pair<int,int>PII;
queue<PII> q;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(matrix[i][j]==0){
dist[i][j]=0;
q.push({i,j});
}
}
}
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
while(!q.empty()){
auto t=q.front();
q.pop();
for(int i=0;i<4;i++){
int nx=t.x+dx[i],ny=t.y+dy[i];
if(nx>=0 && nx<n &&ny>=0 && ny<m &&dist[nx][ny]==-1){
dist[nx][ny]=dist[t.x][t.y]+1;
q.push({nx,ny});
}
}
}
return dist;
}
};
207. 课程表
https://leetcode-cn.com/problems/course-schedule/
经典拓扑排序,做法是将入度为0的点加入队列,然后BFS去删除
如果出现新的点在删除后入度也为0就加入队列
如果出现环就会出现最后不会完全删除
class Solution {
public:
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
vector<vector<int>> g(numCourses);
vector<int> ru(numCourses);
for(auto x:prerequisites){
g[x[0]].push_back(x[1]);
ru[x[1]]++;
}
queue<int >q;
for(int i=0;i<numCourses;i++){
if(ru[i]==0) q.push(i);
}
int cnt=0;
while(!q.empty()){
int x=q.front();
q.pop();
cnt++;
for(int i=0;i<g[x].size();i++){
int k=--ru[g[x][i]];
if(k==0){
q.push(g[x][i]);
}
}
}
return cnt==numCourses;
}
};
210. 课程表 II
https://leetcode-cn.com/problems/course-schedule-ii/
其实就是上题
class Solution {
public:
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
vector<vector<int>> g(numCourses);
vector<int> ru(numCourses);
vector<int> ans;
for(auto x:prerequisites){
g[x[1]].push_back(x[0]);
ru[x[0]]++;
}
queue<int >q;
for(int i=0;i<numCourses;i++){
if(ru[i]==0){
q.push(i);
ans.push_back(i);
}
}
int cnt=0;
while(!q.empty()){
int x=q.front();
q.pop();
cnt++;
for(int i=0;i<g[x].size();i++){
int k=--ru[g[x][i]];
if(k==0){
q.push(g[x][i]);
ans.push_back(g[x][i]);
}
}
}
if(cnt!=numCourses){
vector<int>temp(0);
return temp;
}
return ans;
}
};

浙公网安备 33010602011771号