Вот мое решение в псевдокоде; обратите внимание, что возможно иметь два решения, а также одно или ни одного:
func anna(A, n) # array and length
ht := {} # create empty hash table
for k in [0,n) # iterate over array
if A[k] in ht # previously seen
ht{k} := ht{k} + 1 # increment count
else # previously seen
ht{k} := 1 # initialize count
solved := False # flag if solution found
for k in keys(ht) # iterate over hash table
if ht{k} > n / 3 # found solution
solved := True # update flag
print k # write it
if not solved # no solution found
print "No solution" # report failure
Первое for
l oop занимает время O ( n ). Вторая for
l oop потенциально занимает время O ( n ), если все элементы в массиве различны, хотя чаще всего вторая for
l oop занимает намного меньше времени. Таблица ha sh занимает пространство O ( n ), если все элементы в массиве различны, хотя чаще всего это занимает гораздо меньше места.
Можно оптимизировать решение так, он останавливается рано и сообщает о сбое, если нет возможных решений. Чтобы сделать это, сохраните переменную max в первом for
l oop, увеличивайте ее каждый раз, когда она будет превышена новым числом таблиц ha sh, и проверяйте после добавления каждого элемента в таблица ha sh, если max + n - k <<em> n / 3.