【劍指offer-解題系列(51)】陣列中重複的數字
阿新 • • 發佈:2019-02-14
題目描述
在一個長度為n的數組裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意一個重複的數字。 例如,如果輸入長度為7的陣列{2,3,1,0,2,5,3},那麼對應的輸出是重複的數字2或者3。分析
本題可以有O(n)的解決方法: 不斷審查輸入陣列 a[n] 的第一個數字 a[0] while a[0]!=0 如果a[0]==a[a[0]] 直接返回a[0],說明這個就是重複數字 否則 交換 a[0] 和 a[a[0]];end 如果a[0]!=0,則審查a[1],如果a[1]==1,則繼續採用同樣的方法,審查a[2],a[3],a[4]。。。。。直到所有的數字都審查通過
程式碼實現
bool duplicate(int a[], int n, int* duplication) {if(n<=1)
return false;
int position_target = 0;
for(int i=0;i<n;i++){
position_target = a[i];
while(position_target!=i){
swap(a[i],a[position_target]);
if(a[i]==a[position_target]){
*duplication = a[i];
return true;
}
position_target = a[i];
}
}
return false;
} 交換 a[0] 和 a[a[0]];