idea
给出内容为0~n-1的序列,只能用0和其他数字交换的前提下把序列变为递增数列。
用0换且希望次数最少
==> 0不在0号位时,0和所在位置对应的数值进行交换;0在0号位时,要和不在本位上的数进行交换,而非已经在本位上的数值。
==>若不在0号位,找到首个不在本位上的数值进行交换;
只要0不在本位上,和位置对应的数进行交换即可
其中,存储数值间的映射关系,可利用数组下标存放数,数组内容存放位置
solution1(部分测试点超时)
没有利用好键值的映射关系,每次都要O(n)找到位置
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e5 + 10;
int a[maxn];
int main(){
int n, p1, p2, flag = 1, ans = 0;
scanf("%d", &n);
for(int i = 0; i < n; i++){
scanf("%d", a + i);
if(!a[i]) p1 = i;
}
while(flag){
p2 = -1;
if(p1){
for(int i = 0