任意交換數組中兩個元素,使得有序的最小交換次數


這次牛客那個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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM