给定一个整数数组,我们必须找到按降序对数组进行排序所需的最小交换次数。我们可以在最佳解决方案中做到甚至优于O(n ^ 2)吗?
例如:输入数组:[1234]
。
输出:交换次数:2
说明:
([1234] -> [4231] -> [4321]).
4
和1
。2
和3
以获得降序。只需修改此问题:https://www.geeksforgeeks.org/minimum-number-swaps-required-sort-array/
我的代码如下:
vector<int> v[1000];
bool visit[1000];
// This function will return the size of the cycle.
int graphsize(int i)
{
visit[i] = true;
int s = 1;
for(auto x: v[i])
if(!visit[x])
s += graphsize(x);
return s;
}
int minSwaps(vector<int> popularity) {
for(int i =popularity.size(); i>0; i-- )
v[i].push_back(popularity[i]-1), v[popularity[i]-1].push_back(i);
int swaps = 0;
sort(popularity.begin(), popularity.end(), greater<int>()); // Sort in descending order
for(int i = popularity.size(); i>0 ;i--)
{
if(!visit[i])
swaps += graphsize(i) - 1;
}
return swaps;
}
执行此操作时出现分段错误。 有人可以告诉我这段代码在哪里出问题吗?