Wenn Sie sich für Duplikate interessieren, verwenden Sie eine Hash-Map, um Liste A zu indizieren, wobei der Schlüssel das Element und der Wert die Anzahl der Male ist, die dieses Element gesehen wurde.
Sie durchlaufen das erste und für jedes Element in A und fügen es dort mit dem Wert 1 ein. Wenn es bereits in der Karte vorhanden ist, fügen Sie diesem Wert eins hinzu.
Als nächstes iterieren Sie durch B, und wenn der Wert vorhanden ist, subtrahieren Sie 1. Wenn nicht, geben Sie -1 in den Wert in der Tabelle für dieses Element ein.
Zum Schluss durchlaufen Sie die Karte und drucken für jedes Element mit dem Wert! = 0 als Differenz aus.
private static <T> List<T> intersectArrays(List<T> a, List<T> b) {
Map<T, Long> intersectionCountMap = new HashMap<T, Long>((((Math.max(a.size(), b.size()))*4)/3)+1);
List<T> returnList = new LinkedList<T>();
for(T element : a) {
Long count = intersectionCountMap.get(element);
if (count != null) {
intersectionCountMap.put(element, count+1);
} else {
intersectionCountMap.put(element, 1L);
}
}
for (T element : b) {
Long count = intersectionCountMap.get(element);
if (count != null) {
intersectionCountMap.put(element, count-1);
} else {
intersectionCountMap.put(element, -1L);
}
}
for(T key : intersectionCountMap.keySet()) {
Long count = intersectionCountMap.get(key);
if (count != null && count != 0) {
for(long i = 0; i < count; i++) {
returnList.add(key);
}
}
}
return returnList;
}
Dies sollte ausgeführt werden O(n)
, da wir die Listen jeweils nur einmal und die Karte nur einmal wiederholen. Die hier in Java verwendeten Datenstrukturen sollten effizient sein, da sie HashMap
mit einer Kapazität aufgebaut sind, die die größte Größe der Listen verarbeiten kann.
Ich verwende a LinkedList
für die Rückgabe, da es uns die Möglichkeit bietet, eine Liste für unsere Kreuzung unbekannter Größe hinzuzufügen und zu durchlaufen.