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;
        }
    }
}
相关推荐
MATLAB代码顾问8 分钟前
多种群协同进化算法(MPCE)求解大规模作业车间调度问题——附MATLAB代码
开发语言·算法·matlab
FQNmxDG4S12 分钟前
JVM内存模型详解:堆、栈、方法区与垃圾回收
java·jvm·算法
Hello_Embed21 分钟前
Windows 安装 Claude Code 并接入 模型
windows·笔记·ai编程
Muyuan199827 分钟前
28.Paper RAG Agent 开发记录:修复 LLM Rerank 的解析、Fallback 与可验证性
linux·人工智能·windows·python·django·fastapi
We་ct31 分钟前
LeetCode 72. 编辑距离:动态规划经典题解
前端·算法·leetcode·typescript·动态规划
AI科技星32 分钟前
精细结构常数α作为SI 7大基本量纲统一耦合常数的量子几何涌现理论
算法·机器学习·数学建模·数据挖掘·量子计算
txzrxz1 小时前
动态规划——背包问题
算法·动态规划
Yingye Zhu(HPXXZYY)1 小时前
洛谷 P15553 [CCPC 2025 哈尔滨站] 液压机
算法
谭欣辰2 小时前
LCS(最长公共子序列)详解
开发语言·c++·算法
m0_629494732 小时前
LeetCode 热题 100-----17.缺失的第一个正数
数据结构·算法·leetcode