力扣-图论-19【算法学习day.69】

前言

###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!!


习题

1.最大人工岛

题目链接: 827. 最大人工岛 - 力扣(LeetCode)

题面:

**分析:**我最开始想用并查集做,将未改变的grid中的所有岛划分开来,然后遍历里面的0,看上下左右是否存在岛屿,如果存在求合并的大小并更新最大值,遇到的一个麻烦就是grid是二维数组,怎么将x和y换算成一个不会重复的哈希值,所以这个方法我没行通,灵神也是这个思路,不过是单独开一个集合来标记每个1属于哪个岛屿,多大,非常巧妙

灵神代码:

java 复制代码
class Solution {
    private static final int[][] DIRS = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};

    public int largestIsland(int[][] grid) {
        int n = grid.length;
        List<Integer> area = new ArrayList<>();
        // DFS 每个岛,统计各个岛的面积,记录到 area 列表中
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] == 1) {
                    area.add(dfs(grid, i, j, area.size() + 2));
                }
            }
        }

        // 特判没有岛的情况
        if (area.isEmpty()) {
            return 1;
        }

        int ans = 0;
        Set<Integer> s = new HashSet<>();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] != 0) {
                    continue;
                }
                s.clear();
                int newArea = 1;
                for (int[] dir : DIRS) {
                    int x = i + dir[0];
                    int y = j + dir[1];
                    if (0 <= x && x < n && 0 <= y && y < n && grid[x][y] != 0 && s.add(grid[x][y])) {
                        newArea += area.get(grid[x][y] - 2); // 累加面积
                    }
                }
                ans = Math.max(ans, newArea);
            }
        }

        // 如果最后 ans 仍然为 0,说明所有格子都是 1,返回 n^2
        return ans == 0 ? n * n : ans;
    }

    private int dfs(int[][] grid, int i, int j, int id) {
        grid[i][j] = id; // 记录 (i,j) 属于哪个岛
        int size = 1;
        for (int[] dir : DIRS) {
            int x = i + dir[0];
            int y = j + dir[1];
            if (0 <= x && x < grid.length && 0 <= y && y < grid.length && grid[x][y] == 1) {
                size += dfs(grid, x, y, id);
            }
        }
        return size;
    }
}

后言

上面是力扣图论专题,下一篇是其他的习题,希望有所帮助,一同进步,共勉!

相关推荐
凤山老林1 分钟前
授权模型只会RBAC?深入 ABAC 授权模型,实现权限判断做成策略引擎
大数据·数据库·算法
中电金信16 分钟前
从业务调优到分层缓存:DeepSeek V4 Flash的PPU实践
java·开发语言
snow@li22 分钟前
ruoyi-vue-pro/芋道源码:一键改包名/用项目自带的 ‌ProjectReactor‌ 程序/彻底、省事
java
熊出没26 分钟前
CommitLoom 使用教程:在 IntelliJ IDEA 中自动生成 Git 提交信息
java·git·intellij-idea
叼烟扛炮26 分钟前
Linux 学习笔记(三):文件管理与文本查看
linux·笔记·学习
海绵宝宝转agent27 分钟前
2026-10-21学习笔记
笔记·学习·算法
动词ing27 分钟前
【学习笔记】51单片机 点亮一个LED灯
笔记·学习·51单片机
zhangrelay28 分钟前
手机十周年以上长期稳定测试意义不大正常非暴力使用电池健康都在七成以上
笔记·学习·智能手机
Dxy123931021638 分钟前
ShardingSphere 自定义分片算法:BINARY(16) UUIDv7 哈希分片实现
算法·哈希算法
Z21-X42 分钟前
云原生运维学习笔记:存储、网络与操作系统——云计算的底层基石
运维·笔记·学习·云原生