LeetCode-928. 尽量减少恶意软件的传播 II【深度优先搜索 广度优先搜索 并查集 图 哈希表】

LeetCode-928. 尽量减少恶意软件的传播 II【深度优先搜索 广度优先搜索 并查集 图 哈希表】

  • 题目描述:
  • 解题思路一:
  • 解题思路二:0
  • 解题思路三:0

题目描述:

给定一个由 n 个节点组成的网络,用 n x n 个邻接矩阵 graph 表示。在节点网络中,只有当 graph[i][j] = 1 时,节点 i 能够直接连接到另一个节点 j。

一些节点 initial 最初被恶意软件感染。只要两个节点直接连接,且其中至少一个节点受到恶意软件的感染,那么两个节点都将被恶意软件感染。这种恶意软件的传播将继续,直到没有更多的节点可以被这种方式感染。

假设 M(initial) 是在恶意软件停止传播之后,整个网络中感染恶意软件的最终节点数。

我们可以从 initial 中删除一个节点,并完全移除该节点以及从该节点到任何其他节点的任何连接。

请返回移除后能够使 M(initial) 最小化的节点。如果有多个节点满足条件,返回索引 最小的节点 。

示例 1:

输入:graph = [[1,1,0],[1,1,0],[0,0,1]], initial = [0,1]
输出:0
示例 2:

输入:graph = [[1,1,0],[1,1,1],[0,1,1]], initial = [0,1]
输出:1
示例 3:

输入:graph = [[1,1,0,0],[1,1,1,0],[0,1,1,1],[0,0,1,1]], initial = [0,1]
输出:1

提示:

n == graph.length
n == graph[i].length
2 <= n <= 300
graph[i][j] 是 0 或 1.
graph[i][j] == graph[j][i]
graph[i][i] == 1
1 <= initial.length < n
0 <= initial[i] <= n - 1
initial 中每个整数都不同
LeetCode-924. 尽量减少恶意软件的传播【深度优先搜索 广度优先搜索 并查集 图 哈希表】是将节点由恶意软件感染的变好。而此题是直接删除!

解题思路一:

暴力做法是,枚举删除 x=initial[i],然后从其它没有被删除的 initial[j] 开始,跑 DFS(或者 BFS 等),计算有多少个点能被感染到。对于每个 x,需要 O(n2) 的时间遍历 graph,总的时间复杂度为 O(mn2),其中 m 为 initial 的长度。

能否像 924 题那样做到 O(n2)时间?

逆向思维,从不在 initial 中的点 v 出发 DFS,在不经过 initial 中的节点的前提下,看看 v 是只能被一个点感染到,还是能被多个点感染到。如果 v 只能被点 x=initial[i]感染到,那么在本次 DFS 过程中访问到的其它节点,也只能被点 x 感染到。

举例说明。
在这里插入图片描述
上图中,initial=[1,5]。我们从 0 出发 DFS,在不经过 1,5 的前提下,可以访问到节点 0,3,4,并且发现了恰好一个在 initial 中的节点 1。这意味着删除节点 1,就会让 0,3,4免受感染。而从 2 出发 DFS,可以发现两个在 initial 中的节点,所以无论删除节点 1 还是删除节点 5,节点 2 一定会被感染。

具体算法如下:

  1. 创建一个 vis 数组,标记在 DFS 中访问过的节点。
  2. 枚举 [0,n−1] 中没有访问过的,且不在 initial 中的节点 iii。
  3. 从 i 开始 DFS。
  4. DFS 过程中,只访问不在 initial 中的节点,统计访问到的节点个数 size。
  5. DFS 过程中,如果发现了在 initial 中的节点,按照 924 题解 中的状态机,更新变量 nodeId。
  6. DFS 结束后,如果 nodeId≥0,那么把 nodeId(作为 key)和 size(作为 value)添加到一个哈希表或数组 cnt 中,其中相同的 nodeId 要累加 size。
  7. 最后,如果 cnt 为空,返回 min⁡(initial);否则返回 cnt 中 size 最大的 nodeId,如果有多个 size 一样大,返回其中 nodeId 的最小值。

代码实现时,可以用一个哈希表或者布尔数组,记录哪些点在 initial 中,从而在 DFS 中快速判断当前节点的邻居是否在 initial 中。

class Solution:def minMalwareSpread(self, graph: List[List[int]], initial: List[int]) -> int:st = set(initial)vis = [False] * len(graph)def dfs(x: int) -> None:vis[x] = Truenonlocal node_id, sizesize += 1for y, conn in enumerate(graph[x]):if conn == 0:continueif y in st:# 按照 924 题的状态机更新 node_id# 注意避免重复统计,例如上图中的 0 有两条不同路径可以遇到 1if node_id != -2 and node_id != y:node_id = y if node_id == -1 else -2elif not vis[y]:dfs(y)cnt = Counter()for i, seen in enumerate(vis):if seen or i in st:continuenode_id = -1size = 0dfs(i)if node_id >= 0: # 只找到一个在 initial 中的节点# 删除节点 node_id 可以让 size 个点不被感染cnt[node_id] += size# size 取反计算最大值,相同最大值取 node_id 最小值return min((-size, node_id) for node_id, size in cnt.items())[1] if cnt else min(initial)

时间复杂度:O(n2)
空间复杂度:O(n)

解题思路二:0


时间复杂度:O(n)
空间复杂度:O(n)

解题思路三:0


时间复杂度:O(n)
空间复杂度:O(n)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网盘——添加好友

关于添加好友&#xff0c;过程如下&#xff1a; A、首先客户端A发送加好友的请求&#xff0c;发送的信息包括双方的用户名 B、当服务器收到请求之后&#xff0c;服务器将数据库中在线用户查找出来&#xff0c;如果客户端B已经是你的好友了&#xff0c;服务器告诉客户端A他已经…

ArkTs

一、概述 ArkTs是由TypeScript扩展而来&#xff0c;在继承TypeScript语法的基础上进行了一系列优化&#xff0c;使开发者能够以更简洁、更自然的方式开发应用。 TypeScript语法: 线上网站:https://www.typescriptlang.org/zh/play 二、TS变量 变量声明: 常量声明: const b…

Ubuntu Vs code配置ROS开发环境

文章目录 1.开发环境2.集成开发环境搭建2.1 安装Ros2.2 安装 Vs code2.3 安装vs code 插件 3.Vs code 配置ROS3.1 创建ROS工作空间3.2 从文件夹启动Vs code3.3 使用Vscode 编译ROS 空间3.4 使用Vs code 创建功能包 4.编写简单Demo实例4.1编写代码4.2编译与执行 1.开发环境 系统…

【学习笔记】Python大数据处理与分析——Matplotlib数据可视化

一、绘图步骤 1、导入第三方库 import matplotlib.pyplot as plt import numpy as np 2、准备数据 x1 np.linspace(1, 10, 5) y1 np.sin(x1) 3、开始绘图 plt.plot(x1, y1, linewidth3) 4、完善图表 plt.title("plot figure") plt.xlabel("value of x&qu…

DC/DC电源模块直流升压变换器电压控制输出5V12V24V转0-50V80V110V150V180V200V250V300V500V800V1000V

特点 效率高达 75%以上1*2英寸标准封装单电压输出可直接焊在PCB 上工作温度: -40℃~75℃阻燃封装&#xff0c;满足UL94-V0 要求温度特性好电压控制输出,输出电压随控制电压线性变化 应用 GRB 系列模块电源是一种DC-DC升压变换器。该模块电源的输入电压分为&#xff1a;4.5~9V、…

基于JavaWeb开发的springboot网约车智能接单规划小程序[附源码]

基于JavaWeb开发的springboot网约车智能接单规划小程序[附源码] &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种…

基于springboot实现大创管理系统【项目源码+论文说明】计算机毕业设计

基于springboot实现大创管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了大创管理系统的开发全过程。通过分析大创管理系统管理的不足&#xff0c;创建了一个计算机管理大创管理系统的方案。文章介…

【漏洞复现】云时空社会化商业ERP系统命令执行漏洞

01 漏洞描述 云时空社会化商业ERP系统存在命令执行漏洞&#xff0c;攻击者可以通过此漏洞获取服务器权限。 02 搜索语法 Fofa-Query: app"云时空社会化商业ERP系统" 03 漏洞复现 漏洞POC请查看公众号文章详情&#xff1a; 【漏洞复现】云时空社会化商业ERP系统命…

为什么要学习大模型应用开发?

1 学习大模型的重要性 底层逻辑 人工智能大潮已来&#xff0c;不加入就可能被淘汰。就好像现在职场里谁不会用PPT和excel一样&#xff0c;基本上你见不到。你问任何一个人问他会不会用PPT&#xff0c;他都会说会用&#xff0c;只是说好还是不好。你除非说这个岗位跟电脑完全无…

聚酰亚胺PI材料难于粘接,用什么胶水粘接?那么让我们先一步步的从认识它开始(二十八): 聚酰亚胺PI材料可以与哪些材料相互粘接?

聚酰亚胺PI材料可以与哪些材料相互粘接&#xff1f; 聚酰亚胺&#xff08;PI&#xff09;是一种具有特殊化学结构和物理性质的高分子材料&#xff0c;其耐高低温性能、高绝缘性、耐化性以及低热膨胀系数等特点使其被广泛应用于FPC基材和各种耐高温电机电器的绝缘材料。然而&…

2024 CKA 基础操作教程(十四)

题目内容 设置配置环境&#xff1a; [candidatenode-1] $ kubectl config use-context mk8s Task 现有的 Kubernetes 集群正在运行版本 1.29.0。仅将 master 节点上的所有 Kubernetes 控制平面和节点组件升级到版本 1.29.1。 确保在升级之前 drain master 节点&#xff0c…

论文对比实验

目录 1 Denoising Diffusion Probabilistic Feature-Based Network for Cloud Removal in Sentinel-2 Imagery 2 Cloud Removal in Remote Sensing Using Sequential-Based Diffusion Models 3 Diffusion Enhancement for Cloud Removal in Ultra-Resolution Remote Sensin…