LeetCode算法练习top100:(6)图论

java 复制代码
package top100.图论;

import java.util.LinkedList;
import java.util.Queue;

public class TOP {
    //200. 岛屿数量
    //网格类问题的 DFS 遍历方法
    int[][] ways = new int[][]{{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
    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, m, n);
                }
            }
        }
        return res;
    }
    private void dfs(char[][] grid, int i, int j, int m, int n) {
        grid[i][j] = '0';
        for (int[] way : ways) {
            int x = i + way[0], y = j + way[1];
            if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == '1') {
                dfs(grid, x, y, m, n);
            }
        }
    }


    // 994. 腐烂的橘子
    // BFS遍历图
    //同时遍历所有的腐烂橘子,类似对k个有序链表排序问题的处理思想,用队列记录当前要处理的结点
    public int orangesRotting(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        int fresh = 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) {
                    fresh++;
                } else if (grid[i][j] == 2) {
                    queue.add(new int[]{i, j});
                }
            }
        }
        int[][] ways = new int[][]{{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
        int res = 0;
        while (fresh > 0 && !queue.isEmpty()) { //while (fresh > 0)会有死循环,有无法感染到的橘子
            res++;
            int k = queue.size();
            //每轮取出上一轮感染的橘子
            for (int i = 0; i < k; i++) {
                int[] cur = queue.poll();
                for (int[] way : ways) {
                    int x = cur[0] + way[0];
                    int y = cur[1] + way[1];
                    //可以感染的新鲜橘子
                    if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1) {
                        fresh--;
                        grid[x][y] = 2;//将本轮感染的橘子标记,防止重复遍历
                        queue.add(new int[]{x, y});
                    }
                }
            }
        }
        //有橘子无法感染
        if (fresh > 0) {
            return -1;
        } else {
            return res;
        }
    }
}
相关推荐
祁同伟.1 分钟前
【OJ】二叉树的经典OJ题
数据结构·c++·算法·容器·stl
自在极意功。14 分钟前
贪心算法深度解析:从理论到实战的完整指南
java·算法·ios·贪心算法
wydaicls1 小时前
C语言对单链表的操作
c语言·数据结构·算法
傻童:CPU1 小时前
C语言需要掌握的基础知识点之排序
c语言·算法·排序算法
大数据张老师6 小时前
数据结构——邻接矩阵
数据结构·算法
低音钢琴6 小时前
【人工智能系列:机器学习学习和进阶01】机器学习初学者指南:理解核心算法与应用
人工智能·算法·机器学习
傻童:CPU8 小时前
C语言需要掌握的基础知识点之前缀和
java·c语言·算法
又见野草8 小时前
软件设计师知识点总结:数据结构与算法(超级详细)
数据结构·算法·排序算法
GalaxyPokemon9 小时前
有一个服务器,用于提供HTTP服务,但是需要限制每个用户在任意的100秒内只能请求60次,怎么实现这个功能
算法
fly五行9 小时前
Windows 系统下使用 Docker 安装 Milvus 向量数据库
windows·docker·milvus