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;
    }
相关推荐
Mortalbreeze5 天前
0 - 1 BFS 算法详解:从基本原理到经典题目建模
数据结构·c++·算法·图论·宽度优先
一去不复返的通信er6 天前
力扣-图论-岛屿数量
算法·leetcode·图论
春弦_9 天前
自用算法整理二
数据结构·算法·图论
lvwangshu10 天前
P8981 「DROI」Round 1 距离 题解
动态规划·图论·题解·dp·树形dp·技巧·换根dp·性质题·思维好题
海海不掉头发10 天前
图论与应用_课堂笔记
笔记·图论
云淡风轻~窗明几净11 天前
角谷猜想最接近严格证明的测试 Version1.1.1
人工智能·算法·机器学习·图论
云淡风轻~窗明几净11 天前
角谷猜想与百度AI的对话dialog(原始稿)
人工智能·算法·机器学习·图论
罗湖老棍子12 天前
【例 1】Sightseeing Trip(信息学奥赛一本通- P1494)(洛谷-P10927)
数据结构·算法·图论·最短路·floyd·最小环
罗湖老棍子12 天前
【例题1】黑暗城堡(信息学奥赛一本通- P1486)
算法·图论·最短路·dijkstra·最小生成树·最短路径生成树
Coder-magician13 天前
图论总结篇
算法·图论