สมมติว่ามีคู่รัก N และพวกเขาได้นั่งบนที่นั่ง 2N ที่เรียงกันเป็นแถวและต้องการจับมือกัน เราต้องหาจำนวนการแลกเปลี่ยนขั้นต่ำเพื่อให้ทุกคู่นั่งเคียงข้างกัน
ผู้คนและที่นั่งแสดงด้วยตัวเลขตั้งแต่ 0 ถึง 2N-1 คู่รักจะเรียงลำดับกัน เช่น คู่แรกเป็น (0, 1) คู่ที่สองเป็น (2, 3) เป็นต้น คู่สุดท้ายเป็น (2N-2, 2N-1)
ที่นั่งเริ่มต้นของคู่รักจะได้รับจากอาร์เรย์อื่นที่เรียกว่า row และ row[i] เป็นค่าของผู้ที่นั่งในที่นั่ง i-th ในขั้นต้น
ดังนั้นหากอินพุตเป็น [0,2,4,1,3,5] เอาต์พุตจะเป็น 2
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดหนึ่งบล็อกของข้อมูลที่เรียกว่า UF ในบล็อกนี้ให้กำหนดคุณสมบัติและฟังก์ชันบางอย่างดังนี้ -
-
กำหนดพาเรนต์อาร์เรย์
-
เริ่มต้นบล็อก UF โดยใช้ค่า N จากนั้นทำดังต่อไปนี้ −
-
นับ :=N
-
parent :=อาร์เรย์ขนาด N
-
สำหรับการเริ่มต้น i :=0 เมื่อ i
-
parent[i] :=i
-
-
parent[i] :=i
-
พาร์ :=getParent(ก)
-
parB :=getParent(b)
-
ถ้า parA เหมือนกับ parB แล้ว −
-
กลับ
-
-
(ลดจำนวนลง 1)
-
ผู้ปกครอง[parB] :=parA
-
กำหนดฟังก์ชัน getParent() ซึ่งต้องใช้ i
-
ถ้า parent[i] เหมือนกับ i แล้ว −
-
กลับมา
-
-
ส่งคืนพาเรนต์[i] =getParent(พาเรนต์[i])
-
จากวิธีหลัก ให้ทำดังต่อไปนี้ −
-
n :=ขนาดแถว, N :=n / 2
-
สร้างบล็อก UF หนึ่งบล็อกที่เรียกว่า uf และเริ่มต้นด้วย N
-
สำหรับการเริ่มต้น gr :=0 เมื่อ gr
-
a :=row[gr * 2]
-
b :=row[gr * 2 + 1]
-
โทร unionn(a / 2, b / 2) ของ uf
-
-
return N - นับ uf
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; class Solution { public: class UF{ public: vector<int> parent; int count; UF(int N){ count = N; parent = vector<int>(N); for (int i = 0; i < N; i++) { parent[i] = i; } } void unionn(int a, int b){ int parA = getParent(a); int parB = getParent(b); if (parA == parB) return; count--; parent[parB] = parA; } int getParent(int i){ if (parent[i] == i) return i; return parent[i] = getParent(parent[i]); } }; int minSwapsCouples(vector<int>& row) { int n = row.size(); int N = n / 2; UF uf(N); for (int gr = 0; gr < N; gr++) { int a = row[gr * 2]; int b = row[gr * 2 + 1]; uf.unionn(a / 2, b / 2); } return N - uf.count; } }; main(){ Solution ob; vector<int> v = {0,2,4,1,3,5}; cout << (ob.minSwapsCouples(v)); }
อินพุต
{0,2,4,1,3,5}
ผลลัพธ์
2