算法学习——LeetCode力扣图论篇1(797. 所有可能的路径、200. 岛屿数量、695. 岛屿的最大面积)

算法学习------LeetCode力扣图论篇1

797. 所有可能的路径

797. 所有可能的路径 - 力扣(LeetCode)

描述

给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序)

graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节点 i 到节点 graph[i][j]存在一条有向边)。

示例

示例 1:

输入:graph = [[1,2],[3],[3],[]]

输出:[[0,1,3],[0,2,3]]

解释:有两条路径 0 -> 1 -> 3 和 0 -> 2 -> 3

示例 2:

输入:graph = [[4,3,1],[3,2,4],[3],[4],[]]

输出:[[0,4],[0,3,4],[0,1,3,4],[0,1,2,3,4],[0,1,4]]

提示

n == graph.length

2 <= n <= 15

0 <= graph[i][j] < n

graph[i][j] != i(即不存在自环)

graph[i] 中的所有元素 互不相同

保证输入为 有向无环图(DAG)

代码解析

cpp 复制代码
class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    void dfs(vector<vector<int>>& graph , int indnx)
    {
        if(indnx == graph.size()-1) 
        {
            path.push_back(graph.size()-1);
            result.push_back(path);
            path.pop_back();
            return;
        }

        for(int i=0 ; i<graph[indnx].size() ;i++)
        {
            path.push_back(indnx);
            dfs(graph,graph[indnx][i]);
            path.pop_back();
        }
        return;
    }
    vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
        dfs(graph,0);
        return result;
    }
};

200. 岛屿数量

200. 岛屿数量 - 力扣(LeetCode)

描述

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

示例

示例 1:

输入:grid = [

["1","1","1","1","0"],

["1","1","0","1","0"],

["1","1","0","0","0"],

["0","0","0","0","0"]

]

输出:1

示例 2:

输入:grid = [

["1","1","0","0","0"],

["1","1","0","0","0"],

["0","0","1","0","0"],

["0","0","0","1","1"]

]

输出:3

提示

m == grid.length

n == grid[i].length

1 <= m, n <= 300

grid[i][j] 的值为 '0' 或 '1'

代码解析

深度优先搜索dfs
cpp 复制代码
class Solution {
public:
    int result = 0;
    int m =0 ,n=0;
    int dir[4][2] = {0,1, 0,-1 , -1,0 , 1,0};
    void dfs(vector<vector<char>>& grid , vector<vector<bool>> &path , int x , int y)
    {
        for(int i=0 ; i<4 ;i++)
        {
            int next_x = x + dir[i][0];
            int next_y = y + dir[i][1];
            
            if(next_x<0||next_x>=m||next_y<0||next_y>=n) continue;
            else if( path[next_x][next_y] == false && grid[next_x][next_y] == '1') 
            {   
                path[next_x][next_y] = true;
                dfs(grid,path,next_x,next_y);
            }
        }
        return;
    }
    int numIslands(vector<vector<char>>& grid) {
        m = grid.size();
        n = grid[0].size();
       
        vector<vector<bool>> path( m , vector<bool>( n ,false) );

        for(int i=0 ; i<m ;i++)
        {
            for(int j=0 ; j<n ;j++)
            {
                if(path[i][j] == false && grid[i][j] == '1')
                {
                    result++;
                    path[i][j] = true;
                    dfs(grid,path,i,j);
                }
            }
        }
        return result;
    }
};
广度优先搜索bfs
cpp 复制代码
class Solution {
public:
    int result = 0;
    int m =0 ,n=0;
    int dir[4][2] = {0,1, 0,-1 , -1,0 , 1,0};
    void bfs(vector<vector<char>>& grid , vector<vector<bool>> &path , int x , int y)
    {
        queue<pair<int,int>> my_que;
        my_que.push({x,y});
        path[x][y] = true;

        while(my_que.size() != 0)
        {
            pair<int,int> cur = my_que.front();
            my_que.pop();

            for(int i=0 ; i<4 ;i++)
            {
                int next_x = cur.first + dir[i][0];
                int next_y = cur.second + dir[i][1];
                
                if(next_x<0||next_x>=m||next_y<0||next_y>=n) continue;
                else if( path[next_x][next_y] == false && grid[next_x][next_y] == '1') 
                {   
                    my_que.push({next_x,next_y});
                    path[next_x][next_y] = true;
                }
            }
        }

        
        return;
    }
    int numIslands(vector<vector<char>>& grid) {
        m = grid.size();
        n = grid[0].size();
       
        vector<vector<bool>> path( m , vector<bool>( n ,false) );

        for(int i=0 ; i<m ;i++)
        {
            for(int j=0 ; j<n ;j++)
            {
                if(path[i][j] == false && grid[i][j] == '1')
                {
                    result++;
                    path[i][j] = true;
                    bfs(grid,path,i,j);
                }
            }
        }
        return result;
    }
};

695. 岛屿的最大面积

695. 岛屿的最大面积 - 力扣(LeetCode)

描述

给你一个大小为 m x n 的二进制矩阵 grid 。

岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。

岛屿的面积是岛上值为 1 的单元格的数目。

计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。

示例

示例 1:

输入:grid = [[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 。

示例 2:

输入:grid = [[0,0,0,0,0,0,0,0]]

输出:0

提示

m == grid.length

n == grid[i].length

1 <= m, n <= 50

grid[i][j] 为 0 或 1

代码解析

cpp 复制代码
class Solution {
public:
    int dir[4][2] = {0,1,0,-1,-1,0,1,0};
    int m=0,n=0;
    int result = 0;
    int tmp_result = 0;
    void dfs(vector<vector<int>>& grid , vector<vector<bool>> &path , int x ,int y)
    {
        for(int i=0 ; i<4 ;i++)
        {
            int next_x = x + dir[i][0];
            int next_y = y + dir[i][1];
            if(next_x<0 || next_x>=m || next_y<0 || next_y>=n) continue;
            if(grid[next_x][next_y] == 1 && path[next_x][next_y] == false)
            {
                tmp_result++;
                path[next_x][next_y] = true;
                dfs(grid,path,next_x,next_y);
            }
        }
    }
    int maxAreaOfIsland(vector<vector<int>>& grid) {
        m = grid.size();
        n = grid[0].size();
        vector<vector<bool>> path(m , vector<bool>( n , false ));
       
        for(int i=0 ; i<m ;i++)
        {
            for(int j=0 ; j<n ;j++)
            {
                if(grid[i][j] == 1 && path[i][j] == false)
                {
                    path[i][j] = true;
                    tmp_result = 1;
                    dfs(grid,path,i,j);
                    if(tmp_result > result) result =tmp_result;
                }
            }
        }
        return result;
    }
};
相关推荐
weixin_514548893 分钟前
机器学习课程学习周报十五
人工智能·学习·机器学习
小码农<^_^>4 分钟前
c++继承(下)
开发语言·c++
Themberfue9 分钟前
基础算法之双指针--Java实现(下)--LeetCode题解:有效三角形的个数-查找总价格为目标值的两个商品-三数之和-四数之和
java·开发语言·学习·算法·leetcode·双指针
AIGC破防黑吗喽10 分钟前
Midjourney零基础学习
人工智能·gpt·学习·ai·stable diffusion·midjourney·ai绘画
盒马盒马19 分钟前
Redis:cpp.redis++通用接口
数据库·c++·redis
LearnTech_12323 分钟前
【学习笔记】手写一个简单的 Spring MVC
笔记·学习·spring·spring mvc
陈序缘34 分钟前
LeetCode讲解篇之322. 零钱兑换
算法·leetcode·职场和发展
-$_$-36 分钟前
【LeetCode HOT 100】详细题解之二叉树篇
数据结构·算法·leetcode
大白飞飞38 分钟前
力扣203.移除链表元素
算法·leetcode·链表
一尘之中1 小时前
网 络 安 全
网络·人工智能·学习·安全