思路就是0不在本位就把0和该在此处的数交换
如果0归位了序列还是乱序就把0和 最近的一个 不在它应该在的位置 的数交换
超时,和段错误问题要注意
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int arr[11000];
int a[11000];
int n, sum, cnt, now = 1;
int main(){
scanf("%d",&n);
for(int i=0; i<n; i++){
scanf("%d",&arr[i]);
a[arr[i]] = i;
if(arr[i] != i && arr[i] != 0) cnt++;
}
while(cnt > 0){
if(a[0] != 0){
int b;
b = a[0];
swap(a[0],a[b]);
cnt--;
sum++;
}
else {
for(int i=now; i<n; i++){
if(a[i] != i){
swap(a[0],a[i]);
sum++;
now = i;
break;
}
}
}
}
cout << sum;
return 0;
}
大佬们都是怎么有思路的啊,,,服,,