题目详情:
给定一个包含1-n的数列,我们通过交换任意两个元素给数列重新排序。求最少需要多少次交换,
能把数组排成按1-n递增的顺序,其中,数组长度不超过100。
例如:
原数组是3,2,1, 我们只需要交换1和3就行了,交换次数为1,所以输出1。
原数组是2,3,1,我们需要交换2和1,变成1,3,2,再交换3和2,变为1,2,3,总共需要的交换次数为2,所以输出2。
我的思路:
遍历数组(假设下标从0开始),如果发现i位置的元素a[i]不在正确的位置(即a[i]!=i+1),
那么将a[i]替换到正确的位置j(其中j=a[i]-1);
j位置的元素换到i位置,重新从i位置开始遍历,直到遍历整个数组。
该算法的时间复杂度为O(n+m),m为原数组中不在正确位置的元素的个数。空间复杂度为O(1).
附上java代码:
public static int run(int a[]) {
int count = 0, temp;
for (int i = 0; i < a.length; i++) {
if (a[i] != i + 1) {// 该元素没有在正确的位置上,将它替换到正确的位置。
count++;
temp = a[i];
a[i] = a[temp - 1];
a[temp - 1] = temp;
i--; // 再次从该位置开始。
}
}
return count;
}