top100-图论

1、岛屿数量

java 复制代码
public int numIslands(char[][] grid) {
        int m = grid.length,n = grid[0].length;
        int res = 0;
        for (int i = 0 ;i < m;i++){
            for (int j = 0 ;j < n;j++){
                if(grid[i][j] == '1'){//如果遇到了陆地
                    res++;//陆地数量++
                    dfs(grid,i,j);//递归该陆地有多大
                }
            }
        }
        return res;
    }

    public void dfs(char[][] grid,int l,int r){
        int m = grid.length,n = grid[0].length;
        if(l < 0 || r >= n || l >= m || r < 0 || grid[l][r] == '0')//如果当前的坐标超出了网格范围,则返回
            return;
        grid[l][r] = '0';//将当前的陆地设置为0,避免再次被访问到
        //递归当前坐标为中心的四个方向,将四个方向中值是1的位置,都设置为0,避免下次被扫描到
        dfs(grid,l - 1,r);
        dfs(grid,l,r - 1);
        dfs(grid,l + 1,r);
        dfs(grid,l,r + 1);
    }

2、腐烂的橘子

java 复制代码
public int orangesRotting(int[][] grid) {
        int m = grid.length,n = grid[0].length;
        int count = 0;
        Queue<int[]> queue = new LinkedList<>();
        for(int i = 0 ;i < m;i++){
            for(int j = 0 ;j < n;j++){
                if(grid[i][j] == 1){//计算所有的好橘子数量
                    count++;
                }else if(grid[i][j] == 2){//将所有的腐烂中心加入队列里
                    queue.add(new int[]{i,j});
                }
            }
        }
        int res = 0;
        while (count > 0 && !queue.isEmpty()){
            res++;//每腐烂一圈橘子,分钟数++
            int size = queue.size();
            
            for(int i = 0;i < size;i++){
                int[] a = queue.poll();//拿出当前的腐烂橘子
                int l = a[0];
                int r = a[1];
                //遍历当前腐烂橘子的四周,如果是好橘子,则修改为腐烂的,并将修改后的橘子加入到队列里,作为新的腐烂中心
                if(l - 1 >= 0 && grid[l - 1][r] == 1){
                    count--;
                    grid[l - 1][r] = 2;
                    queue.add(new int[]{l - 1,r});
                }
                if(l + 1 < m && grid[l + 1][r] == 1){
                    count--;
                    grid[l + 1][r] = 2;
                    queue.add(new int[]{l + 1,r});
                }
                if(r - 1 >= 0 && grid[l][r - 1] == 1){
                    count--;
                    grid[l][r - 1] = 2;
                    queue.add(new int[]{l,r - 1});
                }
                if(r + 1 < n && grid[l][r + 1] == 1){
                    count--;
                    grid[l][r + 1] = 2;
                    queue.add(new int[]{l,r + 1});
                }
            }
        }
        if(count > 0)//如果好橘子没有被腐烂完,则返回-1
            return -1;
        return res;
    }

3、课程表

java 复制代码
public boolean canFinish(int numCourses, int[][] prerequisites) {
        //记录每一门课的入度
        int[] inDegree = new int[numCourses];
        //记录依赖该门课程的其他测成列表
        List<List<Integer>> list = new ArrayList<>();
        for(int i = 0; i < numCourses;i++){
            list.add(new ArrayList<>());
        }

        //初始化每一门课的入度和依赖该门课程的列表
        for(int[] pre : prerequisites){
            int course = pre[0];
            int precoures = pre[1];
            inDegree[course]++;
            list.get(precoures).add(course);
        }

        //存储入度为0的课程队列
        Queue<Integer> queue = new LinkedList<>();
        for (int i = 0 ;i < numCourses;i++){
            if(inDegree[i] == 0)
                queue.add(i);
        }

        //记录完成的课程数量
        int count = 0;
        while (!queue.isEmpty()){
            int sourse = queue.poll();
            count++;
            //获取当前课程的后缀课程列表
            List<Integer> list1 = list.get(sourse);
            //将该列表中的课程入度减一
            for(int k : list1){
                inDegree[k]--;
                if(inDegree[k] == 0)//如果减一后的入度为0,那么加入队列,表明该课程可以被访问了
                    queue.add(k);
            }
        }
        
        //当上完的课程等于应该要上的课程时,说明可以完成所有课程
        return count == numCourses;
    }
相关推荐
ArturiaZ15 小时前
【day24】
c++·算法·图论
会编程的土豆1 天前
深度优先搜索dfs和广度优先搜索例题bfs
算法·深度优先·图论·洛谷
flyair_China2 天前
【图论和高阶拓扑学】智算数据中心容灾、网络健壮、迟滞性
图论·拓扑学
会编程的土豆2 天前
深度优先搜索刷题(方向数组+DFS思想):解决矩阵单词搜索问题的标准解法
算法·深度优先·图论·洛谷
_dindong3 天前
【图论基础】习题集锦
数据结构·c++·算法·图论·bfs
所以遗憾是什么呢?3 天前
2026牛客寒假训练营-Day2 JEDC
数据结构·算法·贪心算法·动态规划·图论·acm·icpc
赛姐在努力.6 天前
【拓扑排序】-- 算法原理讲解,及实现拓扑排序,附赠热门例题
java·算法·图论
elseif1237 天前
【C++】并查集&家谱树
开发语言·数据结构·c++·算法·图论
我爱工作&工作love我7 天前
P4913 【深基16.例3】二叉树深度 dfs-二叉树的遍历
算法·深度优先·图论