为了得到最小交换次数,只需将0与最终在该位置上的数进行交换,可用map<int,int>来讲数字与位置进行映射。当i位置上的数字为i时,则将该数从map从删掉,当0位于第0位时,且map的size不等于1,则应将0与map中的第二个的key进行交换,再重复以上步骤,直到map的大小等于1时,循环结束。
AC代码:
#include<iostream>
#include<map>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<list>
#include<set>
#include<stack>
#include<cmath>
#include<vector>
using namespace std;
map<int,int> mm;
int main()
{
int n;
scanf("%d",&n);
int mark;
int ans=0;
for(int i=0;i<n;i++)
{
int d;
scanf("%d",&d);
if(d!=i)
mm[d]=i;
}
mark=mm[0];
while(mm.size()!=1)
{
if(mark==0)
{
map<int,int>::iterator it=mm.begin();
it++;
int e=it->first;
int r=it->second;
mm[e]=0;
mm[0]=r;
mark=mm[0];
ans++;
}
mm[0]=mm[mark];
mm.erase(mark);
mark=mm[0];
ans++;
}
printf("%d",ans);
}