Given any permutation of the numbers {0, 1, 2,..., N−1}, it is easy to sort them in increasing order. But what if Swap(0, *)
is the ONLY operation that is allowed to use? For example, to sort {4, 0, 2, 1, 3} we may apply the swap operations in the following way:
Swap(0, 1) => {4, 1, 2, 0, 3}
Swap(0, 3) => {4, 1, 2, 3, 0}
Swap(0, 4) => {0, 1, 2, 3, 4}
Now you are asked to find the minimum number of swaps need to sort the given permutation of the first N nonnegative integers.
Input Specification:
Each input file contains one test case, which gives a positive N (≤105) followed by a permutation sequence of {0, 1, ..., N−1}. All the numbers in a line are separated by a space.
Output Specification:
For each case, simply print in a line the minimum number of swaps need to sort the given permutation.
Sample Input:
10
3 5 7 2 6 4 9 0 8 1
Sample Output:
9
解题思路:
题目给出一组已经打乱排序的数组,让你只能交换值为0和其他的数字,使得最终排序为升序,要求输出最少的交换次数。
1. 首先我们要明确,值为0的数,无论怎么交换,最终都会出现在数组下标为0的位置上。所以我们第一步就是从数组下标为0的位置开始交换,因为是两两交换,每次都会使得至少一个位置上的数字正确,所以肯定能把0放到下标为0的位置上:
while(number[0]!=0){
swap(number[0],number[number[0]]);
times++;
} // 使得number[0]位置上的数字可以出现在正确的位置上
2. 如果此时,依旧没有使得number[i]位置上的数字正确,那么就将0放到number[i]上,在第二次使0归为的途中,number[i]就一定会出现一个正确的数字了。
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int N;
cin>>N;
int number[N];
int times = 0;
for(int i=0;i<N;i++){
cin>>number[i];
}
for(int i=1;i<N;i++){
if(number[i] != i){
while(number[0]!=0){
swap(number[0],number[number[0]]);
times++;
}
if(number[i]!=i){
swap(number[0],number[i]);
times++;
}
}
}
cout<<times;
}