南大高级算法之备考题——最小交换次数

题意:求出一个序列通过交换元素实现升序的最小交换次数。

题解:按部就班地求次数即可,从第一个位置开始,每次通过交换直到该位置被放上应该放上的元素,如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 --;
		}
    }
}
发布了36 篇原创文章 · 获赞 2 · 访问量 2022

猜你喜欢

转载自blog.csdn.net/fumonster/article/details/101906999