解决C ++中的最低互换率Hackerrank问题

时间:2019-10-16 10:56:13

标签: c++ algorithm data-structures

我有一个关于Hackerrank的最小交换问题。

基本上,问题是找到对数组进行排序所需的交换次数。

该数组不包含任何重复的元素。

这是我的代码,但我似乎得到了错误的答案。特别是,我得到的是向量温度数组长度的4倍。

int minimumSwaps(vector<int> arr) {

int n = arr.size();
int count_swap = 0;

vector<int> temp;

for(int i = 0; i < n; ++i){
    cout << temp.size()<<"\n";
    if(arr[i] == i+1){

        temp.push_back(arr[i]);
    }

    else{

        int initial_val = arr[i];

        int next_val = arr[arr[i] - 1];

        temp.push_back(initial_val);

        while(next_val != initial_val){

            temp.push_back(next_val);

            next_val = arr[next_val - 1];

            count_swap += 1;
            }
        }
    if (temp.size() == n){
        break;
    }      

}
print(temp);
return count_swap;


}

我的方法是在数组中找到一个循环循环,所需的最小交换次数是该数目-1。

例如,如果我们有arr = [2,3,4,1,5]

2-> 3-> 4-> 1-> 2

因此存在一个长度为4的循环。因此,所需的最小交换为4-1 = 3。 (由于其他5个已经存在,并且循环长度= 1,因此需要进行0次交换)。

1 个答案:

答案 0 :(得分:0)

该算法遍历向量中的每个元素,然后继续确定该元素处的循环。因此,它遇到第一个循环四次。该算法可能应该改为遍历向量中的循环。