這次牛客那個CSL 的魔法那個題用到了這個知識也是第一次知道
直接模板得了
int getMinSwaps(vector<int> &nums){
//排序
vector<int> nums1(nums);
sort(nums1.begin(),nums1.end());
unordered_map<int,int> m;
int len = nums.size();
for (int i = 0; i < len; i++){
m[nums1[i]] = i;//建立每個元素與其應放位置的映射關系
}
int loops = 0;//循環節個數
vector<bool> flag(len,false);
//找出循環節的個數
for (int i = 0; i < len; i++){
if (!flag[i]){//已經訪問過的位置不再訪問
int j = i;
while (!flag[j]){
flag[j] = true;
j = m[nums[j]];//原序列中j位置的元素在有序序列中的位置
}
loops++;
}
}
return len - loops;
}