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


    797.所有可能的路径

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

    200.岛屿数量

    思路一:深度优先遍历
    • 1.遍历所有位置
    • 2.遍历到没有访问过的岛屿时,res自增,并对它四个方向进行深度优先遍历
    1. class Solution {
    2. public:
    3. int direct[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
    4. void dfs(vectorchar>>&grid,vectorbool>>&visted,int x,int y){
    5. for(int i=0;i<4;i++){//从四个方向进行深度优先搜索
    6. int nextx = x+direct[i][0];
    7. int nexty = y+direct[i][1];
    8. if(nextxsize() && nextx>=0 && nexty0].size() && nexty>=0){//当未越界时
    9. if(grid[nextx][nexty]=='1' && !visted[nextx][nexty]){//当前陆地没有被遍历过时
    10. visted[nextx][nexty]=true;
    11. dfs(grid,visted,nextx,nexty);
    12. }
    13. }
    14. }
    15. }
    16. int numIslands(vectorchar>>& grid) {
    17. int n=grid.size(),m=grid[0].size();
    18. int res=0;
    19. vectorbool>>visted(n,vector<bool>(m,false));
    20. for(int i=0;i//对所有位置进行遍历
    21. for(int j=0;j
    22. if(grid[i][j]=='1' && !visted[i][j]){//当前陆地没有被遍历过时
    23. visted[i][j]=true;
    24. res++;
    25. dfs(grid,visted,i,j);//遍历连接的陆地
    26. }
    27. }
    28. }
    29. return res;
    30. }
    31. };
    思路二:广度优先遍历
    • 1.首先遍历所有位置
    • 2.遇到没有遍历到的陆地,res 自增,并且进入广度优先遍历
    • 3.广度优先遍历:把遍历到的坐标标记后,直接放入栈中,然后在栈中一层一层的进行遍历
    1. class Solution {
    2. public:
    3. int direct[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
    4. void bfs(vectorchar>>&grid,vectorbool>>&visted,int x,int y){
    5. queueint,int>>que;
    6. que.push(make_pair(x,y));
    7. visted[x][y]=true;//加入栈就是已经遍历
    8. while(!que.empty()){
    9. pair<int,int> cur=que.front();//获取栈顶组合
    10. que.pop();
    11. int curx=cur.first;
    12. int cury=cur.second;
    13. for(int i=0;i<4;i++){//从四个方向的第一层进行遍历
    14. int nextx=curx+direct[i][0];
    15. int nexty=cury+direct[i][1];
    16. //防止越界
    17. if(nextx>=0 && nextxsize() && nexty>=0 && nexty0].size()){
    18. if(grid[nextx][nexty]=='1' && !visted[nextx][nexty]){
    19. que.push(make_pair(nextx,nexty));//放入当前层,下次遍历下一层
    20. visted[nextx][nexty]=true;
    21. }
    22. }
    23. }
    24. }
    25. }
    26. int numIslands(vectorchar>>& grid) {
    27. int n=grid.size(),m=grid[0].size();
    28. int res=0;
    29. vectorbool>>visted(n,vector<bool>(m,false));
    30. for(int i=0;i//对所有位置进行遍历
    31. for(int j=0;j
    32. if(grid[i][j]=='1' && !visted[i][j]){//当前陆地没有被遍历过时
    33. visted[i][j]=true;
    34. res++;
    35. bfs(grid,visted,i,j);//遍历连接的陆地
    36. }
    37. }
    38. }
    39. return res;
    40. }
    41. };

    695.岛屿的最大面积

    思路一:广度优先搜索
    • 1.遍历所有位置
    • 2.当前位置为陆地并且没有被遍历过时,进入广度优先遍历
    • 3.广度优先遍历:每次遍历到一块新的陆地时,mid 自增,最后返回mid
    • 4.通过 mid 更新最大面积
    1. class Solution {
    2. public:
    3. int direct[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
    4. int bfs(vectorint>>&grid,vectorbool>>&visted,int x,int y){
    5. queueint,int>>que;
    6. que.push(make_pair(x,y));
    7. visted[x][y]=true;
    8. int mid=1;//初始只有一个岛屿
    9. while(!que.empty()){
    10. pair<int,int>cur=que.front();
    11. que.pop();
    12. int curx=cur.first;
    13. int cury=cur.second;
    14. for(int i=0;i<4;i++){
    15. int nextx=curx+direct[i][0];
    16. int nexty=cury+direct[i][1];
    17. if(nextx>=0 && nextxsize() && nexty>=0 && nexty0].size()){
    18. if(!visted[nextx][nexty] && grid[nextx][nexty]==1){
    19. mid++;//遍历到新的陆地面积自增
    20. que.push(make_pair(nextx,nexty));
    21. visted[nextx][nexty]=true;
    22. }
    23. }
    24. }
    25. }
    26. return mid;
    27. }
    28. int maxAreaOfIsland(vectorint>>& grid) {
    29. int n=grid.size(),m=grid[0].size();
    30. vectorbool>>visted(n,vector<bool>(m,false));
    31. int res=0;
    32. for(int i=0;i
    33. for(int j=0;j
    34. if(!visted[i][j] && grid[i][j]==1){
    35. int mid=bfs(grid,visted,i,j);//获取当前岛屿面积
    36. if(mid>res) res=mid;//更新最大面积
    37. }
    38. }
    39. }
    40. return res;
    41. }
    42. };

     

    思路二:深度优先遍历
    • 1.遍历所有元素
    • 2.遍历到新的陆地时,先标记访问过,再进入深度优先遍历
    • 3.往四个方向进行遍历,遍历到新的陆地时计数自增
    • 4.深度优先搜索结束时,更新最大面积(更新完后注意计数值赋值为1)
    1. class Solution {
    2. public:
    3. int direct[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
    4. int res=0;
    5. int mid=1;
    6. void dfs(vectorint>>&grid,vectorbool>>&visted,int x,int y){
    7. for(int i=0;i<4;i++){
    8. int nextx=x+direct[i][0];
    9. int nexty=y+direct[i][1];
    10. //越界控制
    11. if(nextx>=0 && nextxsize() && nexty>=0 && nexty0].size()){
    12. if(!visted[nextx][nexty] && grid[nextx][nexty]==1){//遍历到新的陆地时
    13. visted[nextx][nexty]=true;
    14. mid++;//面积自增
    15. dfs(grid,visted,nextx,nexty);//进入深度优先搜索
    16. }
    17. }
    18. }
    19. }
    20. int maxAreaOfIsland(vectorint>>& grid) {
    21. int n=grid.size(),m=grid[0].size();
    22. vectorbool>>visted(n,vector<bool>(m,false));
    23. for(int i=0;i
    24. for(int j=0;j
    25. if(!visted[i][j] && grid[i][j]==1){
    26. visted[i][j]=true;
    27. dfs(grid,visted,i,j);//进入深度优先搜索
    28. if(mid>res) res=mid;
    29. mid=1;//记录面积值重新赋值
    30. }
    31. }
    32. }
    33. return res;
    34. }
    35. };

  • 相关阅读:
    搜索与回溯算法,贪心算法
    关于linux的ssh(出现的问题以及ubuntu的ssh配置)
    〖大前端 - 基础入门三大核心之JS篇㉟〗- JavaScript 的DOM简介
    全方位介绍工厂的MES质量检验管理系统
    Linux入门到入土
    Vue太难啦!从入门到放弃day04——Vue组件
    iOS 通信通知 Communication Notifications 的实现
    Elasticsearch索引恢复
    ArcGIS笔记8_测量得到的距离单位不是米?一经度一纬度换算为多少米?
    vue elementui的select组件实现滑到底部分页请求后端接口
  • 原文地址:https://blog.csdn.net/Ricardo_XIAOHAO/article/details/133410714