you are given a list of integers of the same length a and b. you are also given a two-dimensional list of integers c where each element is of the form [i, j] which means that you can swap a[i] and a[j] as many times as you want.return the maximum number of pairs where a[i] = b[i] after the swapping.constraintsn ≤ 100,000 where n is the length of a and bm ≤ 100,000 where m is the length of cexample 1inputa = [1, 2, 3, 4]b = [2, 1, 4, 3]c = [ 0, 1], 2, 3]]output4explanationwe can swap a[0] with a[1] then a[2] with a[3].
问题的核心是,如果 A 中的 [0,1] 是可互换的,而 [1,2] 是可互换的,那么 [0,1,2] 是任意可互换的。
也就是说,可互换它已连接。这种连接是否有助于解决问题?是的!
根据 C 的互换关系,我们可以将 A 划分为几个相连的域。 对于每个连接的域,我们可以随意交换它。 因此,我们可以枚举每个连接域,对于连接域中的每个索引 i,让我们看看 b 中是否有对应的 b[j] == a[i],其中 i 和 j 是同一连接域中的两个点。
具体算法:首先,根据C语言构建集合并进行查询。 然后,每个连接域都存储在一个字典组中,其中 group[i] = list,i 是连接域的元,list 是连接域的点列表。 枚举每个连接域,对于连接域中的每个索引 i,让我们看看 b 中是否有对应的 b[j] == a[i],其中 i 和 j 是同一连接域中的两个点。 积累答案 **支持:python3
python3 code:
class uf: def __init__(self, m): self.parent = {}self.CNT = 0 初始化 Range(M): self 中 i 的 parent、size 和 cnt。parent[i] = i self.cnt += 1 def find(self, x): if x != self.parent[x]: self.parent[x] = self.find(self.parent[x]) return self.parent[x] return x def union(self, p, q): if self.connected(p, q): return leader_p = self.find(p) leader_q = self.find(q) self.parent[leader_p] = leader_q self.cnt -= 1 def connected(self, p, q): return self.find(p) == self.find(q)class solution: def solve(self, a, b, c): n = len(a) uf = uf(n) for fr, to in c: print(fr, to) uf.union(fr, to) group = collections.defaultdict(list) for i in uf.parent: group[uf.find(i)].append(i) ans = 0 for i in group: indices = group[i] values = collections.counter([a[i] for i in indices]) for i in indices: if values[b[i]] 0: values[b[i]] = 1 ans += 1 return ans
复杂性分析
设 n 是数组的长度 a,v 是图形的点数,e 是图形的边数。
时间复杂度:$o(n+v+e)$Space复杂度:$o(n)$We也可以使用BFS或者DFS来生成组,生成组后的逻辑大家都是一样的,所以把这两种方案留给你去实现吧。