题目链接
题目分析
只允许与0
交换,问实现递增排序的最小操作次数
解题思路
为了防止超时,每次查找是否还有乱序结点时,要记录位置,下次从所记录位置处开始查找!
AC程序(C++)
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define maxSize 100010
using namespace std;
int permu[maxSize];
int findWrong(int n, int k) {//找到一个乱序的位置
for (int i = k; i < n; i++) {
if (permu[i] != i)
return i;
}
return -1;
}
int main() {
int n, key;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> permu[i];
if (permu[i] == 0) key = i;//记录0的位置
}
int sum = 0;
int k = 0;
while (true) {
if (key != 0 && key != permu[key]) {//0 在key位
//【限制下标与值不同,否则进入死循环】
swap(permu[key], permu[permu[key]]); //hash交换--若枚举交换则会超时
sum++;
key = permu[key];
}
else {//0就在0号位
k = findWrong(n, k);//k记录检测到的位置,下次从k位开始,否则会尝试
if (k != -1) { //若不记录,每次都从0号位开始检测,会超时
swap(permu[k], permu[key]);
sum++;
key = k;
}
else //完成
break;
}
}
cout << sum << endl;
return 0;
}