【发布时间】:2019-10-16 20:03:04
【问题描述】:
我对 Hackerrank 上的最小交换问题有疑问。
基本上,问题是找出对数组进行排序所需的交换次数。
数组不包含任何重复的元素。
这是我的代码,但我似乎得到了错误的答案。特别是,我得到了向量 temp 数组长度的 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 个交换)。
【问题讨论】:
标签: c++ algorithm data-structures