LeetCode 3310. 移除可疑的方法

ops/2024/10/10 19:27:56/

LeetCode 3310. 移除可疑的方法

你正在维护一个项目,该项目有 n 个方法,编号从 0 到 n - 1。
给你两个整数 n 和 k,以及一个二维整数数组 invocations,其中 invocations[i] = [ai, bi] 表示方法 ai 调用了方法 bi。
已知如果方法 k 存在一个已知的 bug。那么方法 k 以及它直接或间接调用的任何方法都被视为 可疑方法 ,我们需要从项目中移除这些方法。
只有当一组方法没有被这组之外的任何方法调用时,这组方法才能被移除。
返回一个数组,包含移除所有 可疑方法 后剩下的所有方法。你可以以任意顺序返回答案。如果无法移除 所有 可疑方法,则 不 移除任何方法。
示例 1:
输入: n = 4, k = 1, invocations = [[1,2],[0,1],[3,2]]
输出: [0,1,2,3]
解释:
在这里插入图片描述
方法 2 和方法 1 是可疑方法,但它们分别直接被方法 3 和方法 0 调用。由于方法 3 和方法 0 不是可疑方法,我们无法移除任何方法,故返回所有方法。
示例 2:
在这里插入图片描述
输入: n = 5, k = 0, invocations = [[1,2],[0,2],[0,1],[3,4]]
输出: [3,4]
解释:
方法 0、方法 1 和方法 2 是可疑方法,且没有被任何其他方法直接调用。我们可以移除它们。
示例 3:
在这里插入图片描述
输入: n = 3, k = 2, invocations = [[1,2],[0,1],[2,0]]
输出: []
解释:
所有方法都是可疑方法。我们可以移除它们。
提示:
1 <= n <= 105
0 <= k <= n - 1
0 <= invocations.length <= 2 * 105
invocations[i] == [ai, bi]
0 <= ai, bi <= n - 1
ai != bi
invocations[i] != invocations[j]

图、图的遍历

class Node:def __init__(self, val):self.val = valself.next = []self.prev = []class Solution:def remainingMethods(self, n: int, k: int, invocations: List[List[int]]) -> List[int]:if not invocations:return list(set(range(n)) - set([k]))# 建图method_mapping = {}for a, b in invocations:# a -> bif a not in method_mapping:method_mapping[a] = Node(a)if b not in method_mapping:method_mapping[b] = Node(b)node = method_mapping[a]node.next.append(method_mapping[b])for i in range(n):if i not in method_mapping:method_mapping[i] = Node(i)# 查出所有可疑方法bad_method_set = set()q = deque([method_mapping[k]])while q:node = q.popleft()bad_method_set.add(node.val)for i in node.next:if i.val not in bad_method_set:q.append(i)# 验证是否刚好能移除可疑方法flag = Truefor a, b in invocations:if a in bad_method_set and b not in bad_method_set:flag = Falsebreakelif a not in bad_method_set and b in bad_method_set:flag = Falsebreakl = bad_method_set if flag else set()return list(set(range(n)) - l)

http://www.ppmy.cn/ops/123622.html

相关文章

rust使用tokio

Rust 是一种系统编程语言&#xff0c;它强调安全、并发和高性能。tokio 是一个基于 Rust 的异步运行时库&#xff0c;专门用于构建异步应用程序。使用 tokio 可以轻松地管理异步任务&#xff0c;并实现高效的并发。 添加依赖&#xff1a; cargo add tokio -F full 示例&…

Redis 缓存淘汰策略:LRU 和 LFU 的缺点及解决方案详解

引言 Redis 是一款高性能的内存数据库&#xff0c;它的缓存淘汰机制是保障内存使用效率和应用性能的关键。为了在内存有限的情况下保证缓存数据的有效性&#xff0c;Redis 提供了多种缓存淘汰策略&#xff0c;其中 LRU&#xff08;Least Recently Used&#xff0c;最近最少使用…

P1903 [国家集训队] 数颜色 / 维护队列

原题链接 给你一个序列&#xff0c;多次询问 [ l , r ] [l,r] [l,r] 中出现的不同数的个数。这个我会&#xff01;询问离线&#xff0c;然后树状数组——怎么还带修改&#xff1f;这个时候就要请出带修莫队了。 莫队算法可以以 O ( m n ) O(m\sqrt n) O(mn ​) 的时间复杂度…

leetcode经典算法题总结

针对leetcode算法题常见的五大经典复杂算法进行如下总结&#xff1a; &#xff08;1&#xff09;分治法 把一个复杂的问题分成两个或更多的相同或相似的子问题&#xff0c;再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解&#xff0c;原问题的解即子问题的解…

计算机网络:计算机网络体系结构 —— 专用术语总结

文章目录 专用术语实体协议服务服务访问点 SAP 服务原语 SP 协议数据单元 PDU服务数据单元 SDU 专用术语 实体 实体是指任何可以发送或接收信息的硬件或软件进程 对等实体是指通信双方处于相同层次中的实体&#xff0c;如通信双方应用层的浏览器进程和 Web 服务器进程。 协…

C++ : STL容器之string剖析

STL容器之string剖析 一、string 的迭代器&#xff08;一&#xff09;起始迭代器&#xff08;二&#xff09;末尾迭代器&#xff08;三&#xff09;反向迭代器 二、容量相关的函数&#xff08;一&#xff09;size&#xff08;二&#xff09;capacity&#xff08;三&#xff09;…

【机器学习-无监督学习】概率图模型

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科&#xff0c;通过算法和模型让计算机从数据中学习&#xff0c;进行模型训练和优化&#xff0c;做出预测、分类和决策支持。Python成为机器学习的首选语言&#xff0c;…

探索人们最喜爱的AI工具及其应用影响

探索人们最喜爱的AI工具及其应用影响 在科技飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;技术正在改变我们的生活和工作方式。越来越多的人开始使用AI工具来提高效率、简化流程和推动创新。那么&#xff0c;在众多的AI工具中&#xff0c;哪些是人们最喜欢的…