首页 > 编程语言 >每日一道算法题之并查集之岛屿数量

每日一道算法题之并查集之岛屿数量

时间:2024-12-02 23:55:17浏览次数:5  
标签:count index int 查集 岛屿 union 算法 static public

class Solution {
    public static int MAXN = 90001;

    public static int[] f = new int[MAXN];

    public static int n = 0;

    public static int union_count = 0;

    public static boolean isSameSet(int i, int j) {
        return find(i) == find(j);
    }

    public static int find(int i) {

        if (f[i] != i) {
            f[i] = find(f[i]);
        }
        return f[i];
    }

    public static void union(int i, int j) {
        int f_i = find(i);
        int f_j = find(j);
        if (f_i != f_j) {
            f[f_i] = f_j;
            union_count++;
        }
    }

    public static void build(int m, int nn) {
        for (int i = 0; i < m * nn; i++) {
            f[i] = i;
        }
        n = m;
        union_count = 0;
    }

    public static int index(int i, int j) {
        return j * n + i;
    }

    public static void main(String[] args) {
        new Solution().numIslands(new char[][] { { '1', '0', '1', '1', '0', '1', '1' } });
    }

    public int numIslands(char[][] grid) {
        // 思路:并查集。每个坐标来确定唯一的索引。
        // 每个位置判断 右边和下边的位置。是1就合并。
        int m = grid.length;
        int nn = grid[0].length;
        build(m, nn);
        int count_1 = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < nn; j++) {
                // 判断是否为1,为0直接跳过
                if (grid[i][j] == '0') {
                    continue;
                }
                count_1++;// 累计1的数量
                int cur_index = index(i, j);
                // 判断 向右 是否越界 并且是1.
                if (j + 1 < nn && grid[i][j + 1] == '1') {
                    int right_index = index(i, j + 1);
                    union(cur_index, right_index);
                }
                // 判断向下是否越界。并且是1;
                if (i + 1 < m && grid[i + 1][j] == '1') {
                    int down_index = index(i + 1, j);
                    union(cur_index, down_index);
                }
            }
        }
        return count_1 - union_count;

    }
}

标签:count,index,int,查集,岛屿,union,算法,static,public
From: https://www.cnblogs.com/clllll/p/18583050

相关文章

  • 通过matlab分别对比PSO,反向学习PSO,多策略改进反向学习PSO三种优化算法
    1.程序功能描述分别对比PSO,反向学习PSO,多策略改进反向学习PSO三种优化算法.对比其优化收敛曲线。2.测试软件版本以及运行结果展示MATLAB2022A版本运行 3.核心程序 fort=1:tmaxttime(t)=t;w=0.5;fori=1:Popift>1......
  • 「Java进阶」数据结构与算法全攻略:从基础理论到实战应用
    「Java进阶」数据结构与算法全攻略:从基础理论到实战应用目录第1章绪论1.1数据结构的基础概念1.2数据结构的内容1.3算法1.4算法描述1.5算法性能评价1.5.1算法的时间性能分析1.5.2算法的空间性能分析1.5.3算法性能选择1.6数据结构与Java语言表示......
  • 「Java实战」贪心算法VS穷举法:从理论解析到案例实战,全面掌握算法精髓
    「Java实战」贪心算法VS穷举法:从理论解析到案例实战,全面掌握算法精髓目录引言项目概述技术栈贪心算法详解穷举法详解广播覆盖问题问题描述贪心算法解决方案穷举法解决方案钱币找零问题问题描述贪心算法解决方案穷举法解决方案代码示例Maven依赖配置运行和测试结......
  • 基于大爆炸优化算法的PID控制器参数寻优matlab仿真
    1.课题概述基于大爆炸优化算法的PID控制器参数寻优matlab仿真。对比优化前后的PID控制输出。 2.系统仿真结果 3.核心程序与模型版本:MATLAB2022asteps=range0;it=1;whilesteps>=range2%输出迭代信息it%生成新种群fori=1:Npopx(:,......
  • 3、贪心算法python(活动选择问题、单源最短路径)
    一、活动选择问题给定一组活动,每个活动都有一个开始时间和结束时间,要求选择尽可能多的活动,并且这些活动之间不能有重叠。贪心策略的核心思想是每次选择结束时间最早的活动,这样可以为后续的活动留出更多的时间空间。活动选择问题的贪心算法步骤1、排序:首先按活动的结束时间对......
  • 数据结构与算法学习笔记----堆
    数据结构与算法学习笔记----堆@@author:明月清了个风@@lastedited:2024.12.2ps⛹从这里开始调整了文章结构,先讲解算法和数据结构基本原理,再给出例题,针对例题中的应用再讲解思路。堆堆是一种完全二叉树,常用于实现优先队列(priority_queue)等功能,可以根据堆内元素......
  • 数据结构初阶--算法复杂度(1)
    以下我用C语言实现基础的数据结构。目录初识数据结构与算法数据结构算法算法效率练习:轮转数组(不完全版)时间复杂度大O的渐进表示法例一: 例二:例三:例四:例五:总结:例六:例七:例八:阶乘递归的时间复杂度初识数据结构与算法数据结构数据结构(DataStructure)是计算......
  • 排序算法之归并排序
    归并排序归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(DivideandConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。代价是需要额外的内存空间。若将两个有序表合并成一个有序表,称为......
  • 使用联邦学习法训练强化学习算法以实现对抗攻击性:读论文——小型微型计算机系统(中文CC
    论文地址:http://xwxt.sict.ac.cn/CN/Y2024/V45/I7/1552PS:这个学习率有些奇怪,用数据量占一次优化的总数据量的大小作为学习率,这或许也是真的有独创性的操作了,不过这么做是否真的可行呢,或者这只是纸上谈兵呢。PS:这里的状态转移概率怎么和策略的动作选择概率比......
  • 代码随想录算法训练营第三十一天|leetcode56. 合并区间、leetcode738.单调递增的数字
    1leetcode56.合并区间题目链接:56.合并区间-力扣(LeetCode)文章链接:代码随想录视频链接:贪心算法,合并区间有细节!LeetCode:56.合并区间哔哩哔哩bilibili思路:其实很清楚,跟之前的方法差不多,但是自己写的时候就是有地方不会了,会不知道接下来的思路是什么1.1视频后的思路卡壳......