Я бы сделал так, чтобы создать массив в два раза больше исходного и создать набор целых чисел.
Затем перебрать исходный массив, добавить каждый элемент в набор, если онуже существует, добавьте его во вторую половину нового массива, иначе добавьте в первую половину нового массива.
В конце вы получите массив, который выглядит следующим образом: (на вашем примере)
1,7,4,8,2,6,3,9,10, -, -, 8,7, -, -, -, -, -, -, -, -, -
Затем я бы снова перебрал исходный массив и сделал каждую точку равной следующей ненулевой позиции (или 0, или как вы решили)
Это бы заставило исходный массив превратиться в ваше решение...
В итоге получается, что O (n) настолько эффективен, насколько я могу представить,
Edit: since you can not use another array, when you find a value that is already in the
set you can move every value after it forward one and set the last value equal to the
number you just checked, this would in effect do the same thing but with a lot more operations.