Вы можете продолжить поиск в табу:
Прокрутите список и получите максимум 4 первого i-го элемента.
Затем на следующем шаге просто проверьте, превосходит ли i + 1-й элемент максимум максимума предыдущих элементов
- если i + 1> = предыдущий максимум, то новый максимум = i + 1 повторно установить табу
- если i + 1 <предыдущий максимум, то если предыдущий максимум был найден меньше N
шаг назад сохранить предыдущий (вот табу) </li>
- если i + 1 <предыдущий максимум и предыдущий максимум равен табу, тогда возьмите новый
максимум 4 я + 1-й элементы. </li>
Я не уверен, что это понятно, но скажите мне, если у вас есть какие-либо вопросы.
ниже приведен код на python для его проверки.
l=[15,10,9,16,20,14,13,11,12]
N=4
res=[-1] #initialise res
tabu=1 #initialise tabu
for k in range(0,len(l)):
#if the previous element res[-1] is higher than l[k] and not tabu then keep it
#if the previous is tabu and higher than l[k] make a new search without it
#if the previous is smaller than l[k] take the new max =l[k]
if l[k]<res[-1] and tabu<N:
tabu+=1
res.append(res[-1])
elif l[k] < res[-1] and tabu == N:
newMax=max(l[k-N+1:k+1])
res.append(newMax)
tabu=N-l[k-N+1:k+1].index(newMax) #the tabu is initialized depending on the position of the newmaximum
elif l[k] >= res[-1]:
tabu=1
res.append(l[k])
print res[N:] #take of the N first element
Сложность:
Я обновил код thx до flolo и сложности. это больше не O (N), а O (M * N)
Худший случай, когда вам нужно пересчитать максимум на каждом шаге цикла. например, список строго уменьшается.
на каждом шаге цикла необходимо пересчитать максимум M элементов
тогда общая сложность составляет O (M * N)