サイズnの配列があり、配列に含まれる要素は1とn-1の間にあり、各要素が1回発生し、1つの要素が複数回出現する。この要素を見つける必要があります。配列内の複製要素の検索
これは非常によくある質問ですが、まだ適切な答えが見つかりませんでした。ほとんどの提案は、私は配列のすべての要素を追加し、それからすべてのインデックスの合計を引く必要がありますが、要素の数が非常に多い場合、これは機能しません。オーバーフローします。 XORゲートdup = dup^arr[i]^i
の使用に関する提案もありますが、これは私には分かりません。
私はこのアルゴリズムを思いつきました。これは加算アルゴリズムの強化であり、オーバーフローの可能性を大幅に低減します!
for i=0 to n-1
begin :
diff = A[i] - i;
sum = sum + diff;
end
diff
重複した要素が含まれていますが、この方法を使用して、私は、重複する要素のインデックスを見つけることができません。そのためには、アレイをもう一度トラバースする必要があります。これは望ましくありません。誰かが追加メソッドやXORメソッドが含まれていない、より良い解決策を考え出すことができますか?
これは、[O(n)時間とO(1)スペースで重複を見つける](http://stackoverflow.com/q/5739024/134633)* – caf
の問題のほんの一例です。私はもう一度アレイを横断する必要があります。これは望ましくありません。なぜそれは望ましくないのですか? 2回目に配列をトラバースしても、アルゴリズムの複雑さは変わりません。 – sepp2k
@caf:そこの解決策はここで望ましくないような配列を変更します。 –