番号の重複配列(安全offer_3を証明するために)

アレイにおけるnの長さの全ての数は、n-1の範囲は0です。一部のデジタル配列が重複しているが、反復的であり、各桁が数回繰り返されるかわからないどのように多くの番号がわかりません。重複した数字のいずれかの配列を見つけてください。

入力:

{2,3,1,0,2,5}

出力:

2

問題解決のアイデア:

必要とされる時間複雑度はO(N)、空間的複雑度はO(1)です。ソート方法を使用すると、タグの追加の配列を使用することはできません、使用することができませんでした。

この配列要素[0、N-1]の問題の範囲を解決するために、要素は、i番目の位置iの値に調整することができます。要素は、iの値を持っている場合は、この質問は、i番目の位置であり、重複した番号を検索するように求め、その調整過程、iの値が繰り返される知ることができます。

(2,3,1,0,2,5)の例として、4位を横切るように、この位置は数2であるが、第2の位置に2の値を有し、ガイドが2繰り返すことができます:

 

 

 

パブリック ブール重複(INT [] NUMS、INT長、INT []複製){
     場合(NUMS == NULL ||長さ<= 0 戻り 以下のためにINT I 0 =; I <長さ、I ++ ){
         ながら(!NUMS [I] = I){
             場合(NUMS [I] == NUMS [NUMS [I]]){ 
                重複[ 0] = NUMS [I ];
                返す ; 
            } 
            スワップ(NUMS、I、NUMS [I])。
        }
    } 
    を返す 
} 

プライベート ボイドスワップ(INT [] NUMS、int型 I、INT J){
     int型 T = NUMS [I]。
    NUMS [I] = NUMS [J]。
    NUMS [J] = T。
}

おすすめ

転載: www.cnblogs.com/ziytong/p/12079747.html