【LeetCode每日一题】924. 尽量减少恶意软件的传播(并查集)

news2024/11/26 4:52:29

文章目录

    • [924. 尽量减少恶意软件的传播](https://leetcode.cn/problems/minimize-malware-spread/)
          • 思路:并查集
          • 代码:


924. 尽量减少恶意软件的传播

在这里插入图片描述

思路:并查集
  1. 构建并查集:首先,代码创建了一个 UnionFind 类来维护节点之间的连通关系。它使用了并查集的数据结构,其中 p 数组存储每个节点的父节点,而 size 数组存储每个节点所在集合的大小。
  2. 遍历图并建立连接关系:接下来,代码遍历了给定的图 graph,并对图中存在连接的节点调用 union 方法,将它们所在的集合合并起来。
  3. 统计感染节点数:然后,代码统计了每个初始感染节点所在集合的感染节点数量,并更新了最小节点的值。
  4. 寻找优化的方案:接着,代码再次遍历了初始感染节点数组 initial,对每个节点进行如下操作:
    • 找到该节点所在集合的根节点。
    • 如果该集合中只有一个初始感染节点,那么比较该集合的大小和最大感染节点数,更新答案为当前节点和最大感染节点数。
  5. 返回结果:最后,代码返回了答案,如果没有找到优化的方案,则返回最小节点。
代码:
class Solution {
    public int minMalwareSpread(int[][] graph, int[] initial) {
        int n = graph.length;
        UnionFind uf = new UnionFind(n);//用并查集维护节点的连通关系
        for (int i = 0; i < n; i++) {
            for (int j = i+1; j < n; j++) {
                if (graph[i][j] == 1) {//如果存在连接
                    uf.union(i, j);//将节点i和节点j所在的集合合并
                }
            }
        }
        int ans = n;
        int min = n;//最小结点
        int max = 0;//最大感染数
        int[] count = new int[n];
        for (int x : initial) {
            count[uf.find(x)]++;//统计每个初始感染节点所在集合的感染节点数量
            min = Math.min(min, x);//更新最小节点
        }
        for (int x : initial) {
            int root = uf.find(x);
            if (count[root] == 1) {
                int size = uf.size(root);
                if (size > max || (size == max && x < ans)) {
                    // 如果当前集合的大小大于最大感染节点数,或者当前集合的大小等于最大感染节点数但节点值较小
                    ans = x;//更新答案为当前节点
                    max = size;//更新最大感染节点数
                }
            }
        }
        return ans == n ? min : ans;//ans==n说明没找到优化的方案,直接返回最小的结点。
    }
}
class UnionFind {
    //维护节点之间的连通关系
    private final int[] p;//存储父结点
    private final int[] size;//存储每个结点所在集合的大小

    public UnionFind(int n) {
        p = new int[n];
        size = new int[n];
        for (int i = 0; i < n; i++) {
            p[i] = i;//把每个父结点设置为自己
            size[i] = 1;//每个集合的初始大小为1
        }
    }

    public int find(int x) {
        //查找结点所在集合的根节点
        if (p[x] != x) {
            //如果父结点不是自己
            p[x] = find(p[x]);
        }
        return p[x];
    }

    public boolean union(int a, int b) { // 将两个节点所在的集合合并
        int pa = find(a);
        int pb = find(b);
        if (pa == pb) {
            //根节点相同,说明两个结点已经是在一个集合中了。
            return false;
        }
        if (size[pa] > size[pb]) {
            p[pb] = pa;//将集合b连接到集合a上
            size[pa] += size[pb];//更新集合a的大小
        }else {
            p[pa] = pb;
            size[pb] += size[pa];
        }
        return true;
    }

    public int size(int root) {
         获取指定根节点所在集合的大小
        return size[root];
    }
}

点击移步博客主页,欢迎光临~

偷cyk的图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1600161.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AIGC教育行业全景报告:AI助教和家教成真,学习机迎来新机遇

原文&#xff1a;AIGC教育行业全景报告&#xff1a;AI助教和家教成真&#xff0c;学习机迎来新机遇 - AI新智界 图片来源&#xff1a;由无界AI生成 经过一年的快速迭代&#xff0c;业内对于生成式AI将会率先落地于哪些行业已经有了答案。 教育领域&#xff0c;不仅被OpenAI列…

leetcode1448.统计二叉树中的好节点数目

1. 题目描述 题目链接 2. 解题思路 首先看一下题目的“核心”&#xff0c;什么是好节点&#xff1a;从根到该节点 X 所经过的节点中&#xff0c;没有任何节点的值大于 X 的值。也就是说&#xff0c;我们只要知道了从根节点到该节点的所有的值&#xff0c;就可以判断该节点是…

【代理模式】静态代理-简单例子

在Java中&#xff0c;静态代理是一种设计模式&#xff0c;它涉及到为一个对象提供一个代理以控制对这个对象的访问。静态代理在编译时就已经确定&#xff0c;代理类和被代理类会实现相同的接口或者是代理类继承被代理类。客户端通过代理类来访问&#xff08;调用&#xff09;被…

iOS依赖库版本一致性检测:确保应用兼容性

一、背景 在 iOS 应用开发的世界里&#xff0c;每次 Xcode 更新都带来了新的特性和挑战。最近的 Xcode 15 更新不例外&#xff0c;这次升级引入了对 SwiftUI 的自动强依赖。SwiftUI最低是从 iOS 13 开始支持。 这一变化也带来了潜在的兼容性问题。如果您的项目在升级到 Xcode…

《大话数据结构》02 算法

算法是解决特定问题求解步骤的描述&#xff0c;在计算机中表现为指令的有限序列&#xff0c;并且每条指令表示一个或多个操作。 1. 两种算法的比较 大家都已经学过一门计算机语言&#xff0c;不管学的是哪一种&#xff0c;学得好不好&#xff0c;好歹是可以写点小程序了。现在…

为什么你不用懒人建站工具?套用这四个wordpress主题模板,1小时轻松搭建网站

懒人建站工具&#xff0c;凭借简单易用、快速上手和个性化定制的特点&#xff0c;为不熟悉代码和程序的人提供了搭建美观实用网站的便捷途径。无需专业的前端开发知识&#xff0c;无需雇佣专业开发人员&#xff0c;用户便能轻松实现网站搭建&#xff0c;满足个人或企业需求。懒…

【可实战】测试体系与测试方案设计(业务按公司实际情况,技术可参考通用测试方案)

一、如果我们要测试一个系统&#xff0c;首先我们要了解被测系统的架构 &#xff08;一&#xff09;业务架构-从需求里面去了解&#xff08;角色和行为&#xff09;&#xff1a; 业务模型分析&#xff08;是一个电商&#xff0c;还是一个企业的crm&#xff0c;还是一个网站&a…

高等数学——一文搞定二重积分

文章目录 二重积分的基本概念二重积分的性质累次积分计算二重积分的方法和技巧描点画图法对称性利用函数的奇偶性变量的轮换对称性 积分次序的选择积分区域的确认先看变量和先积变量基本原则穿线法确定先积变量的曲线范围 常见的曲线经典题目 二重积分的基本概念 定义&#xf…

ChatGPT 可以预测未来吗?

推荐 4月13日的一篇有趣的 paper&#xff0c;特来分享。 &#x1f449; 当前的大型语言模型&#xff08;LLMs&#xff09;具有强大的数据合成和推理能力&#xff0c;但它们在直接预测尚未发生事件的准确性上常常受到限制。传统的预测方法依赖于直接询问模型关于未来的问题。 …

测出Bug就完了?从4个方面教你Bug根因分析

01 现状及场景 &#x1f3af; 1.缺失bug根因分析环节 工作10年&#xff0c;虽然不是一线城市&#xff0c;也经历过几家公司&#xff0c;规模大的、规模小的都有&#xff0c;针对于测试行业很少有Bug根因环节&#xff0c;主流程基本上都是测试提交bug-开发修改-测试验证-发送报…

Spring学习(二)

图解&#xff1a; 2.核心容器总结 2.2.1 容器相关 BeanFactory是IoC容器的顶层接口&#xff0c;初始化BeanFactory对象时&#xff0c;加载的bean延迟加载 ApplicationContext接口是Spring容器的核心接口&#xff0c;初始化时bean立即加载 ApplicationContext接口提供基础的be…

为什么科拓停车选择OceanBase来构建智慧停车SaaS应用

本文来自OceanBase的客户——拓客停车的实践分享 科拓停车简介与业务背景 作为智慧停车行业的佼佼者&#xff0c;科拓停车致力于提供全方位的智慧停车解决方案。服务涵盖车场运营管理、互联网智慧停车平台以及停车场增值服务等。通过不断研发创新&#xff0c;打造出了多样化的…

C++命名空间在内部声明函数,在外部定义函数

C命名空间在内部声明函数&#xff0c;在外部定义函数 #include <iostream> namespace A {int a;void func(); } void A::func() {std::cout << "Hello World!" << std::endl; } void main() {A::func(); }实际运行的代码和结果图如下&#xff1a;…

十大排序——10.基数排序

下面我们来看一下基数排序 目录 1.介绍 2.代码实现 3.总结与思考 1.介绍 基数排序&#xff08;Radix sort&#xff09;是一种非比较型整数排序算法 基本思想&#xff1a; 它的原理是将整数按位数切割成不同的数字&#xff0c;然后按每个位数分别比较。基数排序的方式可以…

「51媒体」如何有效进行媒体邀约,提升宣传传播效果?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 进行有效的媒体邀约&#xff0c;提升宣传传播效果的关键在于策略性和专业性。以下是具体的做法&#xff1a; 明确目标&#xff1a;要确立清晰的品牌推广目标和策略&#xff0c;包括确定目…

DBUtils工具类的使用

1、DBUtils是什么 为了更加简单地使用JDBC&#xff0c;Apache组织提供了一个DBUtils工具&#xff0c;它是操作数据库的一个组件&#xff0c;实现了对JDBC的简单封装&#xff0c;可以在不影响数据库访问性能的情况下简化JDBC的编码工作量。DBUtils工具要有2个作用。 写数据&am…

【Linux】服务器硬件及RAID配置实战

目录 一、服务器 1.服务器 2.查看服务器信息 二、RAID 磁盘阵列 三、软RAID的创建和使用 1.添加硬盘&#xff0c;fdisk分区&#xff0c;分区类型ID设置为 fd 2.使用mdadm创建软raid 3.格式化 4.挂载使用 5.mdadm 一、服务器 1.服务器 分类机架式居多 塔…

Yolo-world+Python-OpenCV之摄像头视频实时目标检测

上一次介绍了如何使用最基本的 Yolo-word来做检测&#xff0c;现在我们在加opencv来做个实时检测的例子 基本思路 1、读取离线视频流 2、将视频帧给yolo识别 3、根据识别结果 对视频进行绘制边框、加文字之类的 完整代码如下&#xff1a; import datetimefrom ultralytics …

Lagent AgentLego 智能体介绍

本文主要介绍智能体相关基础知识&#xff0c;主流的智能体开源项目&#xff0c;重点介绍Lagent智能体和AgentLego框架。 一. 为什么要有智能体 目前的大预言模型有一些局限性&#xff0c;包括有时候会生成虚假信息&#xff0c;也就是我们说的“大模型胡言乱语”&#xff0c;还…

多线程意义

直接上代码 我们来看两个程序 由一个线程和两个线程运行的区别&#xff1a; 单线程&#xff08;main&#xff09;&#xff1a; public static void test(){long a 0;long b 0;for(long i 0; i < 10000000000l; i){a;}for(long i 0; i < 10000000000l; i){b;}} 多…