今天在龐果網做的一道題目,
可是卻沒有挑戰成功,說多了都是淚,直接上題。
給定一個包含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。
起初,我以為這是一個用冒泡排序算法做的題目,可是卻不是。
數組排序完成後的每個元素都符合a[n]=n這個條件,所以可以利用這個條件來減少很多不必要的數組元素交換。
正確做法如下:
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
int run(const int *a,int n) {
int* b=new int[n];
int i,j,number=0;
for(i=0;i<n;i++)b[i]=a[i];
for(i=0;i<n;i++)
{
if(b[i]!=i+1)
{
for(j=i+1;j<n;j++)
{
if(b[j]==i+1)
{
int temp=b[j];
b[j]=b[i];
b[i]=temp;
number++;
}
}
}
}
return number;
}本文出自 “淡定的dreamer” 博客,請務必保留此出處http://idiotxl1020.blog.51cto.com/6419277/1290281