1、有序数组,按照0到n – 1的序列编号,顺序打乱,请您用最小的交换操作次数,使其重新变成递增序列。假如:编号保存在一个数组array当中。一次交换操作可以将这个数组的其中两个数互换。
限制:
1 <= n <= 100000
例 1:
输入: array = [2,0,1]
输出: 2
解释: 先交换0和2(一次交换操作),再交换1和2(一次交换操作)即可。
例 2:
输入: array = [0,1,2,3,4]
输出: 0
解释: 不用任何交换。
2、若初始序列为gbfcdae,那么至少需要__次两两交换,才能使该序列变为abcdefg。任给一个自由a--g这7个字母组成的排列,最坏的情况下需要至少__次两两交换,才能使序列变为abcdefg。
解题思路:求数组中环的数量。
private static int function(int[] array) {
if (array == null || array.length == 0) {
return 0;
}
int count = 0;
int len = array.length;
int[] temp = new int[len];
for (int i = 0; i < len; i++) {
if (temp[i] == 0) {
count++;
for (int j = i; temp[j] == 0;j = array[j]) {
temp[j] = 1;
}
}
}
return len - count;
}
思路解析:
1、首先,最多需要交换几次?答案是n次,这很好想,把每个数放到本应在的地方,即使那个数本来就在那我们依旧算它交换一次,所以最多是n次。
然后,我们要找环,假设这个环有k个数,所谓的环就是这k个数可以不借助其他的数进行归位,然后我们交换k-1次即可,可以发现每多一个环就少一次交换,所以是n-环的数量。
2、https://www.nowcoder.com/questionTerminal/acaafbd0eeca448aad4997f43f357f2f?orderByHotValue=0&pos=39&mutiTagIds=579