- 题目:
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所在数组中的下标,记为i,找到i所在的下标,记为j,若A[0] != 0,交换之,否则找到第一个下标和数组中值不相等的元素,交换之
代码实现:
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
bool is_order(int A[], int n){
for(int i =0; i < n; i++){
if(A[i] != i)
return false;
}
return true;
}
int main()
{
int n;
cin >> n;
int A[n] ={0};
for(int i = 0; i < n; i++){
scanf("%d", &A[i]);
//cin >>A[i];
}
int k = 0; //记录交换的次数
int l = 0; //找到0所在的位置
for(; l < n; l++){
if(A[l] == 0)
break;
}
while(!is_order(A,n)) { //当数组无序时
if(A[0] != 0){
int j = 0;
for(; j < n; j++){
if(A[j] == l)
break;
}
swap(A[l], A[j]);
l = j;
}
else
{
int i = 0;
while(A[i] == i)
i++;
swap(A[0], A[i]);
l = i;
}
k++;
}
cout <<k;
return 0;
}
这种解法有两个点超时,发现在while循环中,每次都要判断数组是否有序。则想从这个地方优化
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int main()
{
int n;
cin >> n;
int A[n] ={0};
for(int i = 0; i < n; i++){
scanf("%d", &A[i]);
//cin >>A[i];
}
int left = n,k = 0; //记录交换的次数
for(int i = 0; i < n; i++){
if(A[i] == i)
left--;
}
int l = 0; //找到0所在的位置
for(; l < n; l++){
if(A[l] == 0)
break;
}
while(left > 0) { //当数组无序时
if(A[0] != 0){
int j = 0;
for(; j < n; j++){
if(A[j] == l)
break;
}
swap(A[l], A[j]);
l = j;
if(j != 0)
left--;
else
left -= 2;
}
else
{
int i = 0;
while(A[i] == i)
i++;
swap(A[0], A[i]);
l = i;
left++;
}
k++;
}
cout <<k;
return 0;
}