LeetCode刷题笔记之图论

1. 797【所有可能的路径】

  • 题目: 给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序)。graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节点 i 到节点 graph[i][j]存在一条有向边)。
  • 代码:
class Solution {
   
    List<List<Integer>> ans = new ArrayList<>();
    List<Integer> path = new LinkedList<>();
    public List<List<Integer>> allPathsSourceTarget(int[][] graph) {
   
        //深度优先遍历,本质上与回溯算法一样
        //先使用for循环进行遍历每个节点的下一个可到达节点
        //然后在for循环里进行递归遍历每条路径
        //终止条件是到达最后一个节点
        path.add(0);
        dfs(graph,0);
        return ans;
    }
    public void dfs(int[][] graph,int index){
   
        if(index == graph.length-1){
   
            ans.add(new ArrayList(path));
            return;
        }
        for(int i=0;i<graph[index].length;i++){
   
            path.add(graph[index][i]);
            dfs(graph,graph[index][i]);
            path.removeLast();
        }
    }
}

2. 200【岛屿数量】

  • 题目: 给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。
  • 代码:
class Solution {
   
    public int numIslands(char[][] grid) {
   
        //DFS,设置一个数组记录是否被访问过
        //遍历到一个陆地就进行dfs,land数量加1
        int num = 0;
        int n = grid.length;
        int m = grid[0].length;
        boolean[][] isVisited = new boolean[n][m];
        for(int i=0;i<n;i++){
   
            for(int j=0;j<m;j++){
   
                if(!isVisited[i][j] && grid[i][j]=='1'){
   
                    num++;
                    dfs(grid,isVisited,i,j);
                }
            }
        }
        return num;
    }
    public void dfs(char[][] grid,boolean[][] isVisited,int x,int y){
   
        if(x<0 || x>=grid.length || y<0 || y>=grid[0].length){
   
            return;
        }
        if(isVisited[x][y] || grid[x][y]=='0'){
   
            return;
        }
        isVisited[x][y] = true;
        int[][] loc = new int[][]{
   
            {
   -1,0},
            {
   1,0},
            {
   0,-1},
            {
   0,1}
        };
        for(int i=0;i<4;i++){
   
            int xTmp = x+loc[i][0];
            int yTmp = y+loc[i][1];
            dfs(grid,isVisited,xTmp,yTmp);
        }
    }
}

3. 695【岛屿的最大面积】

  • 题目: 给你一个大小为 m x n 的二进制矩阵 grid 。
    岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。岛屿的面积是岛上值为 1 的单元格的数目。计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。
  • 代码:
class Solution {
   
    public int maxAreaOfIsland(int[][] grid) {
   
        //先用dfs找到岛屿,计算每个岛屿的面积
        //记录最大值
        int m = grid.length;
        int n = grid[0].length;
        boolean[][] isVisited = new boolean[m][n];
        int max = 0;
        for(int i=0;i<m;i++){
   
            for(int j=0;j<n;j++){
   
                if(!isVisited[i][j] && grid[i][j]==1){
   
                    int tmp = dfs(grid,isVisited,i,j);
                    max = Math<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值