day-62 代码随想录算法训练营(19)图论 part 01

news/2024/7/15 19:48:53 标签: 算法, 图论

797.所有可能的路径

分析:从 0~n-1的所有可能的路径
思路一:回溯
  • 使用中间数组mid,添加起始位置 0 ,然后遍历二维数组
  • 遍历到一维时,下一轮递归直接跳入当前值所代表下标的数组中
  • 终止条件:mid的结尾值为 n-1 时 或者 遍历到的数组下标等于 n 时
class Solution {
public:
    vector<vector<int>>res;
    vector<int>mid={0};
    void backtrace(vector<vector<int>>&graph,int starti,int n){
        if(mid.back()==n-1){//遍历到一条路径时
            res.push_back(mid);
            return;
        }
        if(starti==n) return;//超出二维下标
        for(int i=0;i<graph[starti].size();i++){
            mid.push_back(graph[starti][i]);
            backtrace(graph,graph[starti][i],n);
            mid.pop_back();//回溯
        }
    }
    vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
        int n=graph.size();
        backtrace(graph,0,n);
        return res;
        
    }
};

200.岛屿数量

思路一:深度优先遍历
  • 1.遍历所有位置
  • 2.遍历到没有访问过的岛屿时,res自增,并对它四个方向进行深度优先遍历
class Solution {
public:
    int direct[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
    void dfs(vector<vector<char>>&grid,vector<vector<bool>>&visted,int x,int y){
        for(int i=0;i<4;i++){//从四个方向进行深度优先搜索
            int nextx = x+direct[i][0];
            int nexty = y+direct[i][1];
            if(nextx<grid.size() && nextx>=0 && nexty<grid[0].size() && nexty>=0){//当未越界时
                if(grid[nextx][nexty]=='1' && !visted[nextx][nexty]){//当前陆地没有被遍历过时
                    visted[nextx][nexty]=true;
                    dfs(grid,visted,nextx,nexty);
                }
            }
        }
        
    }
    int numIslands(vector<vector<char>>& grid) {
        int n=grid.size(),m=grid[0].size();
        int res=0;
        vector<vector<bool>>visted(n,vector<bool>(m,false));
        for(int i=0;i<n;i++){//对所有位置进行遍历
            for(int j=0;j<m;j++){
                if(grid[i][j]=='1' && !visted[i][j]){//当前陆地没有被遍历过时
                    visted[i][j]=true;
                    res++;
                    dfs(grid,visted,i,j);//遍历连接的陆地
                }
            }
        }
        return res;
    }
};
思路二:广度优先遍历
  • 1.首先遍历所有位置
  • 2.遇到没有遍历到的陆地,res 自增,并且进入广度优先遍历
  • 3.广度优先遍历:把遍历到的坐标标记后,直接放入栈中,然后在栈中一层一层的进行遍历
class Solution {
public:
    int direct[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
    void bfs(vector<vector<char>>&grid,vector<vector<bool>>&visted,int x,int y){
        queue<pair<int,int>>que;
        que.push(make_pair(x,y));
        visted[x][y]=true;//加入栈就是已经遍历
        while(!que.empty()){
            pair<int,int> cur=que.front();//获取栈顶组合
            que.pop();
            int curx=cur.first;
            int cury=cur.second;
            for(int i=0;i<4;i++){//从四个方向的第一层进行遍历
                int nextx=curx+direct[i][0];
                int nexty=cury+direct[i][1];
                //防止越界
                if(nextx>=0 && nextx<grid.size() && nexty>=0 && nexty<grid[0].size()){
                    if(grid[nextx][nexty]=='1' && !visted[nextx][nexty]){
                        que.push(make_pair(nextx,nexty));//放入当前层,下次遍历下一层
                        visted[nextx][nexty]=true;
                    }
                }
            }
            
        }
    }
    int numIslands(vector<vector<char>>& grid) {
        int n=grid.size(),m=grid[0].size();
        int res=0;
        vector<vector<bool>>visted(n,vector<bool>(m,false));
        for(int i=0;i<n;i++){//对所有位置进行遍历
            for(int j=0;j<m;j++){
                if(grid[i][j]=='1' && !visted[i][j]){//当前陆地没有被遍历过时
                    visted[i][j]=true;
                    res++;
                    bfs(grid,visted,i,j);//遍历连接的陆地
                }
            }
        }
        return res;
    }
};

695.岛屿的最大面积

思路一:广度优先搜索
  • 1.遍历所有位置
  • 2.当前位置为陆地并且没有被遍历过时,进入广度优先遍历
  • 3.广度优先遍历:每次遍历到一块新的陆地时,mid 自增,最后返回mid
  • 4.通过 mid 更新最大面积
class Solution {
public:
    int direct[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
    int bfs(vector<vector<int>>&grid,vector<vector<bool>>&visted,int x,int y){
        queue<pair<int,int>>que;
        que.push(make_pair(x,y));
        visted[x][y]=true;
        int mid=1;//初始只有一个岛屿
        while(!que.empty()){
            pair<int,int>cur=que.front();
            que.pop();
            int curx=cur.first;
            int cury=cur.second;
            for(int i=0;i<4;i++){
                int nextx=curx+direct[i][0];
                int nexty=cury+direct[i][1];
                if(nextx>=0 && nextx<grid.size() && nexty>=0 && nexty<grid[0].size()){
                    if(!visted[nextx][nexty] && grid[nextx][nexty]==1){
                        mid++;//遍历到新的陆地面积自增
                        que.push(make_pair(nextx,nexty));
                        visted[nextx][nexty]=true;
                    }
                }
            }
        }
        return mid;
    }
    int maxAreaOfIsland(vector<vector<int>>& grid) {
        int n=grid.size(),m=grid[0].size();
        vector<vector<bool>>visted(n,vector<bool>(m,false));
        int res=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(!visted[i][j] && grid[i][j]==1){
                    int mid=bfs(grid,visted,i,j);//获取当前岛屿面积
                    if(mid>res) res=mid;//更新最大面积
                }
            }
        }
        return res;
    }
};

 

思路二:深度优先遍历
  • 1.遍历所有元素
  • 2.遍历到新的陆地时,先标记访问过,再进入深度优先遍历
  • 3.往四个方向进行遍历,遍历到新的陆地时计数自增
  • 4.深度优先搜索结束时,更新最大面积(更新完后注意计数值赋值为1)
class Solution {
public:
    int direct[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
    int res=0;
    int mid=1;
    void dfs(vector<vector<int>>&grid,vector<vector<bool>>&visted,int x,int y){
        for(int i=0;i<4;i++){
            int nextx=x+direct[i][0];
            int nexty=y+direct[i][1];
            //越界控制
            if(nextx>=0 && nextx<grid.size() && nexty>=0 && nexty<grid[0].size()){
                if(!visted[nextx][nexty] && grid[nextx][nexty]==1){//遍历到新的陆地时
                    visted[nextx][nexty]=true;
                    mid++;//面积自增
                    dfs(grid,visted,nextx,nexty);//进入深度优先搜索
                }
            }
        }
    }
    int maxAreaOfIsland(vector<vector<int>>& grid) {
        int n=grid.size(),m=grid[0].size();
        vector<vector<bool>>visted(n,vector<bool>(m,false));
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(!visted[i][j] && grid[i][j]==1){
                    visted[i][j]=true;
                    dfs(grid,visted,i,j);//进入深度优先搜索
                    if(mid>res) res=mid;
                    mid=1;//记录面积值重新赋值
                }
            }
        }
        return res;
    }
};


http://www.niftyadmin.cn/n/5058316.html

相关文章

1200*A. Flipping Game(前缀和)

解析&#xff1a; 100数据量&#xff0c;两层遍历每个区间&#xff0c;然后前缀和计算1的个数&#xff0c;维护最大值即可。 #include<bits/stdc.h> using namespace std; #define int long long const int N110; int n,a[N],res,sum[N]; signed main(){scanf("%ll…

Docker容器部署初学01

Docker容器就是个虚拟机&#xff0c;如果你不知道什么是虚拟机&#xff0c;那Docker就是在你的操作系统上&#xff0c;复制了一份独立成一个小国家&#xff0c;五脏俱全&#xff0c;可以运行你的全部程序和环境。轻便微小&#xff0c;方便&#xff0c;代替了VM虚拟机的位置&…

通俗易懂-OpenCV角点检测算法(Harris、Shi-Tomas算法实现)

目录 1 图像的特征 2&#xff0c;Harris角点检测 2.1 代码实现 2.2结果展示 3&#xff0c;Shi-Tomasi角点检测算法 3.1 &#xff0c; 代码实现 3.2结果展示 1 图像的特征 2&#xff0c;Harris角点检测 、 2.1 代码实现 import cv2 as cv import matplotlib.pyplot as …

如何改变讨好型人格,做回真正的自己

讨好型人格虽然说不上疾病那么严重&#xff0c;但是又切实的影响了正常的生活&#xff0c;阻碍了个人的事业发展&#xff0c;在人际关系方面也同样面临诸多不良影响。 根据我这段时间的阅读&#xff0c;尤其是知乎上关于讨好型人格的话题实在太多太多。那么如何才能摆脱讨好型…

华为OD机试 - 判断字符串子序列(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入2、输出3、说明 四、Java算法源码五、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&am…

【中国知名企业高管团队】系列22:滴滴

大家好&#xff01; 今天华研荟的走进中国知名企业高管团队系列带大家认识滴滴。 滴滴公司是出行领域的先行者&#xff0c;也是一个典型样本。通过滴滴公司的名字变迁我们可以感受到滴滴公司的业务发展&#xff0c;这也是整个出行行业公司的发展路径&#xff1a; 第一阶段&a…

算法 接雨水问题-(双指针)

牛客网: BM94 题目: 把数组看成柱子高度图&#xff0c;计算最多能接多少雨水 思路: 初始化左右双指针left, right 0, n-1, 初始化高度maxL, maxR&#xff0c;比较maxL与maxR&#xff0c;较小的往对面移动&#xff0c;更新maxL或maxR, 同时统计柱子高度差即为可接雨水数&…

C语言中动态内存管理

前言&#xff1a;为什么存在动态内存分配&#xff0c;为什么要用动态内存分配&#xff0c;动态内存分配的意义。鸡汤&#xff1a;有了坚持不一定成功,但没有坚持&#xff0c;就注定失败&#xff0c;各位也要努力坚持提升自己&#xff01; 动态内存分配 动态内存函数&#xff1a…