假设我们有一个数字A的列表和一个长度相同的数字B的列表。我们还有一个数字C的二维列表,其中每个元素的格式为[i,j],这表明我们可以根据需要交换A [i]和A [j]多次。我们必须找到交换后A [i] = B [i]的最大对数。
因此,如果输入像A = [5,6,7,8],B = [6,5,8,7],C = [[0,1],[2,3]],则输出将为4,因为我们可以将A [0]与A [1]交换,然后将A [2]与A [3]交换。
为了解决这个问题,我们将遵循以下步骤-
N:= A的大小
graph:=通过双向附加给定边的图形。
回答:= 0
看到:=大小为N的列表并用False填充
对于介于0到N范围内的u
队列:=队列并插入u
看过[u]:=真
对于队列中的每个节点,请执行
count:=包含队列中所有i的B [i]元素计数的映射
为队列中的每个我做
如果看到[nei]为假,则
在队列末尾插入nei
看过[nei]:=真
对于graph [node]中的每个nei,执行
count [A [i]]:= count [A [i]]-1
回答:=回答+1
如果count [A [i]]不为零,则
如果看到[u]为零,则
返回ans
让我们看下面的实现以更好地理解-
from collections import Counter class Solution: def solve(self, A, B, edges): N = len(A) graph = [[] for _ in range(N)] for u, v in edges: graph[u].append(v) graph[v].append(u) ans = 0 seen = [False] * N for u in range(N): if not seen[u]: queue = [u] seen[u] = True for node in queue: for nei in graph[node]: if not seen[nei]: queue.append(nei) seen[nei] = True count = Counter(B[i] for i in queue) for i in queue: if count[A[i]]: count[A[i]] -= 1 ans += 1 return ans ob = Solution()A = [5, 6, 7, 8] B = [6, 5, 8, 7] C = [[0, 1],[2, 3]] print(ob.solve(A, B, C))
[5, 6, 7, 8], [6, 5, 8, 7], [[0, 1],[2, 3]]
输出结果
4