1067 Sort with Swap(0,*) (25)(25 分)
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 (<=10^5^) 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
一,我的解法
缺点:若a[0]归位还需要从头查找没有归位的元素,,,同时知道了0所处的位置还需要找这个位置对应的数所处的位置,需要从头遍历。。。时间复杂度高。
#include<iostream>
#include<algorithm>
using namespace std;
int arr[100010];
int main(){
int n;
int k;
int ans=0;
int temp;
int pos;
int flag;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&arr[i]);
}
for(int i=0;i<n;i++){
if(arr[i]==0){
pos=i;
}
}
while(1){
flag=0;
int j;
if(pos==0){
for(j=0;j<n;j++){
if(arr[j]!=j){
break;
}
}
if(j==n){
break;
}
else{
arr[0]=arr[j];
arr[j]=0;
pos=j;
ans++;
}
}
else{
for(int i=0;i<n;i++){
if(arr[i]==pos){
k=i;
break;
}
}
arr[pos]=pos;
arr[k]=0;
pos=k;
ans++;
}
}
printf("%d",ans);
return 0;
}
二,正确解法
优点:从结果出发,下标是具体的数字,存储的是数字所处的位置。
1,解决若0归位的问题,方案是k从1出发,肯定先归位小的。
2,解决寻找0所处位置的数 所处位置的方法,两个pos即可搞定。
另一优点,循环结束条件是left<=0,好过我那个死循环。
#include<iostream>
#include<algorithm>
using namespace std;
int pos[100010];
int main(){
int n,ans=0;
scanf("%d",&n);
int left=n-1,num;
for(int i=0;i<n;i++){
scanf("%d",&num);
pos[num]=i;
if(num==i&&num!=0){
left--;
}
}
int k=1;
while(left>0){
if(pos[0]==0){
while(pos[k]==k){
k++;
}
swap(pos[0],pos[k]);
ans++;
}
else{
swap(pos[0],pos[pos[0]]);
ans++;
left--;
}
}
printf("%d",ans);
return 0;
}