LeetCode 3310. 移除可疑的方法

打印 上一主题 下一主题

主题 894|帖子 894|积分 2682

LeetCode 3310. 移除可疑的方法
   你正在维护一个项目,该项目有 n 个方法,编号从 0 到 n - 1。
给你两个整数 n 和 k,以及一个二维整数数组 invocations,其中 invocations = [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 == [ai, bi]
0 <= ai, bi <= n - 1
ai != bi
invocations != invocations[j]
  图、图的遍历
  1. class Node:
  2.     def __init__(self, val):
  3.         self.val = val
  4.         self.next = []
  5.         self.prev = []
  6. class Solution:
  7.     def remainingMethods(
  8.         self, n: int, k: int, invocations: List[List[int]]
  9.     ) -> List[int]:
  10.         if not invocations:
  11.             return list(set(range(n)) - set([k]))
  12.         # 建图
  13.         method_mapping = {}
  14.         for a, b in invocations:
  15.             # a -> b
  16.             if a not in method_mapping:
  17.                 method_mapping[a] = Node(a)
  18.             if b not in method_mapping:
  19.                 method_mapping[b] = Node(b)
  20.             node = method_mapping[a]
  21.             node.next.append(method_mapping[b])
  22.         for i in range(n):
  23.             if i not in method_mapping:
  24.                 method_mapping[i] = Node(i)
  25.         # 查出所有可疑方法
  26.         bad_method_set = set()
  27.         q = deque([method_mapping[k]])
  28.         while q:
  29.             node = q.popleft()
  30.             bad_method_set.add(node.val)
  31.             for i in node.next:
  32.                 if i.val not in bad_method_set:
  33.                     q.append(i)
  34.         # 验证是否刚好能移除可疑方法
  35.         flag = True
  36.         for a, b in invocations:
  37.             if a in bad_method_set and b not in bad_method_set:
  38.                 flag = False
  39.                 break
  40.             elif a not in bad_method_set and b in bad_method_set:
  41.                 flag = False
  42.                 break
  43.         l = bad_method_set if flag else set()
  44.         return list(set(range(n)) - l)
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

羊蹓狼

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表