题意:求出一个序列通过交换元素实现升序的最小交换次数。
题解:按部就班地求次数即可,从第一个位置开始,每次通过交换直到该位置被放上应该放上的元素,如2 5 4 3 1,我们先得到目标序列1 2 3 4 5,对第一个位置的元素2,它应该被放在第二个,所以交换,次数+1,得到5 2 4 3 1,此时判断第一个位置的元素仍然不是应该放上去的元素,所以再交换,得到1 2 4 3 5,对于第一个位置的交换即视为完成,同理,对剩下的位置依次进行判断和交换。
代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int e_num = scan.nextInt();//测试数
while(e_num>0){
int length = scan.nextInt();
Integer[] array = new Integer[length];
for(int i=0;i<length;i++){
array[i] = scan.nextInt();
}
Integer[] target = array.clone();
Arrays.sort(target,new Comparator<Integer>(){
@Override
public int compare(Integer o1,Integer o2){
if(o1>o2){
return 1;
}
if(o1<o2){
return -1;
}
return 0;
}
});
HashMap<Integer,Integer> map = new HashMap<>();
for(int i=0;i<length;i++){
map.put(target[i],i);
}
boolean[] flag = new boolean[length];
Arrays.fill(flag, false);
int result = 0;
for(int i=0;i<length;i ++){
while(flag[i]==false){
if(map.get(array[i])==i){
flag[i]=true;
break;
}
int temp = array[i];
// System.out.println(temp);
array[i] = array[map.get(array[i])];
array[map.get(temp)] = temp;
result++;
// System.out.println(result);
}
}
System.out.println(result);
e_num --;
}
}
}
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int e_num = scan.nextInt();//测试数
while(e_num>0){
int length = scan.nextInt();
Integer[] array = new Integer[length];
for(int i=0;i<length;i++){
array[i] = scan.nextInt();
}
Integer[] target = array.clone();
Arrays.sort(target,new Comparator<Integer>(){
@Override
public int compare(Integer o1,Integer o2){
if(o1>o2){
return 1;
}
if(o1<o2){
return -1;
}
return 0;
}
});
HashMap<Integer,Integer> map = new HashMap<>();
for(int i=0;i<length;i++){
map.put(target[i],i);
}
boolean[] flag = new boolean[length];
Arrays.fill(flag, false);
int result = 0;
for(int i=0;i<length;i ++){
while(flag[i]==false){
if(map.get(array[i])==i){
flag[i]=true;
break;
}
int temp = array[i];
// System.out.println(temp);
array[i] = array[map.get(array[i])];
array[map.get(temp)] = temp;
result++;
// System.out.println(result);
}
}
System.out.println(result);
e_num --;
}
}
}