现在问题转化为求解 3 中描述的小集合的最少交换次数,对于这样的集合只有在最后一次交换的时候才会发生在第二步中描述的第一种情况,因为如果在最后一次交换前发生了这种情况,假设是第 k 次交换是两两匹配的,那么在第 k 次交换前的所有情侣的组合就可以构成一个更小的组合,不满足我们一开始的假设
总结,如果 ij 靠在一起那么那他们必定是同一个小集合的,通过将 i 节点与 j 节点连接的方式来表示它们属于一个集合,最终我们会的到一张非连通图,答案就是每一个连通分量的大小 -1 的和
classSolution:defminSwapsCouples(self, row: List[int])->int:near = defaultdict(list)vis =set()for i inrange(0,len(row),2):if row[i]//2== row[i +1]//2:vis.add(row[i]//2)continuenear[row[i]//2].append(row[i +1]//2)near[row[i +1]//2].append(row[i]//2)ans =0for i inrange(len(row)//2):if i in vis:continuet =[i]whilelen(t)>0:for _ inrange(len(t)):k = t.pop()if k in vis:continuevis.add(k)t.extend(near[k])ans +=1ans -=1return ans