題目描述: 有 n 對情侶坐在 2n 個座位上,我們想讓每對情侶都能坐在一起(相鄰的兩個座位)。每次操作可以選擇任意兩個人交換座位,求最少需要多少次交換。情侶的編號規則:(0,1)、(2,3)、(4,5)...即第 i 對情侶的編號為 (2i, 2i+1)。
解題思路:
時間複雜度:O(n) — 遍歷一次座位陣列,每次交換為 O(1)
空間複雜度:O(n) — 用 pos 陣列記錄每個人的位置
1. Build position array: pos[person] = seat index
2. For each pair of seats (i, i+1):
a. Find the partner of row[i] using XOR: partner = row[i] ^ 1
b. If row[i+1] != partner:
- Find partner's current position j = pos[partner]
- Swap row[i+1] and row[j]
- Update pos array accordingly
- Increment swap counter
3. Return total swapsUnion-Find 方法:將每對座位看作一個節點,將每對情侶的實際座位連邊。連通分量中若有 k 對,需要 k-1 次交換。時間複雜度同為 O(n),但概念上更直觀地解釋了最少交換次數的本質。
環分解法:將錯位的配對關係建成置換圖,計算每個環的大小。一個大小為 k 的環需要 k-1 次交換來解開。這等價於 Union-Find 方法,但直接用 DFS 找環。