我有一个关于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次交换)。
答案 0 :(得分:0)
该算法遍历向量中的每个元素,然后继续确定该元素处的循环。因此,它遇到第一个循环四次。该算法可能应该改为遍历向量中的循环。