1. 程式人生 > >【劍指offer-解題系列(51)】陣列中重複的數字

【劍指offer-解題系列(51)】陣列中重複的數字

題目描述

在一個長度為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]];