Given an array with distinct numbers, return an integer indicating the minimum number of swap operations required to sort the array into ascending order. 

Example 1:

Input: [5, 1, 3, 2]
Output: 2
Explanation: [5, 1, 3, 2] -> [2, 1, 3, 5] -> [1, 2, 3, 5]

Example 2:

Input: [1, 3, 2]
Output: 1
Explanation: [1, 3, 2] -> [1, 2, 3]
分析:
先把原数组保存一份,然后对另一份排序,并且把原数组的值与index保存一份。这样,我们需要得到某个数的位置的时候,直接通过map得到。

 1 public class Solution {
 2     public int minSwaps(int[] elems) {
 3         int counter = 0;
 4         Map<Integer, Integer> map = buildMap(elems);
 5         int[] copy = new int[elems.length];
 6         System.arraycopy(elems, 0, copy, 0, elems.length);
 7         Arrays.sort(elems);
 8 
 9         for (int i = 0; i < copy.length; i++) {
10             if (copy[i] != elems[i]) {
11                 swap(copy, i, map.get(elems[i]), map);
12                 counter++;
13             }
14         }
15         return counter;
16     }
17 
18     private Map<Integer, Integer> buildMap(int[] elems) {
19         Map<Integer, Integer> map = new HashMap<Integer, Integer>();
20         for (int i = 0; i < elems.length; i++) {
21             map.put(elems[i], i);
22         }
23         return map;
24     }
25 
26     private void swap(int[] elems, int i, int j, Map<Integer, Integer> map) {
27         map.put(elems[j], i);
28         map.put(elems[i], j);
29         int temp = elems[j];
30         elems[j] = elems[i];
31         elems[i] = temp;
32     }
33 }