Это может быть сделано в амортизированном O (n) с использованием набора на основе хэш-таблицы.
Псевдоэкс:
s := new HashSet
c := 0
for each el in a
Add el to s.
If el was not already in s, move (copy) el c positions left.
If it was in s, increment c.