Effizient könnten Sie std::unordered_set
verwenden (um doppelte Indizes eindeutig zu verfolgen) und std::unordered_map
(um eindeutige Zahlen und ihre Indizes zu verfolgen).
Dies geschieht in O(N * [O(1) + ... + O(1)])
... ungefähr = O(N)
:
Erläuterung:
Gegeben ein Array A
rtn
. Verwenden einer KV
(Schlüsselwert) -Karte, dup
; Dabei ist k
ein Element im Array A
und v
ist der Index dieses Elements im Array.
Für jedes Element a
mit dem Index i
im Array:
kv
wenn a
existiert als k
in dup
i
in rtn
ein
v
in rtn
ein
a
und i
als kv
in dup
rtn
zurück
Siehe ein vollständiges Beispiel:
Für eine Eingabe von:
%Vor%Wir haben eine Ausgabe von:
%Vor%Wieder,
Für eine Eingabe von:
%Vor%Wir haben eine Ausgabe von:
%Vor%Wenn Sie die Indizes in der richtigen Reihenfolge benötigen, können Sie das resultierende Array einfach sortieren.
Ich glaube nicht, dass es einen Standard-STL-Weg gibt, dies zu tun. Hier ist eine O (N * N) Lösung:
%Vor%Ein Ansatz, der auf der Sortierung basiert, könnte sich für längere Arrays als effizienter erweisen: Sie müssten jedoch eine Tabelle mit einer neuen Position erstellen - & gt; alte Position, um die Indizes der doppelten Elemente zu erhalten.