Обзор
Учитывая ваш массив a
и индекс вашей текущей позиции i
, повторяйте следующее, пока не дойдете до последнего элемента.
Рассмотрим все возможные "элементы перехода" от a[i+1]
до a[a[i] + i]
. Для каждого такого элемента с индексом e
рассчитайте v
= a[e]
+ e
. Если один из элементов является последним элементом, перейдите к последнему элементу. В противном случае перейдите к элементу с максимальным значением v
.
Проще говоря, из элементов, находящихся в пределах досягаемости, найдите тот, который сделает вас дальше всего при следующем прыжке . Мы знаем, что этот выбор, x
, является правильным, потому что по сравнению с любым другим элементом y
, к которому вы можете перейти, элементы, доступные с y
, являются подмножеством элементов, доступных с x
(за исключением элементов из прыжок назад, что явно является плохим выбором).
Этот алгоритм работает в O (n), потому что каждый элемент должен рассматриваться только один раз (элементы, которые будут рассматриваться во второй раз, могут быть пропущены).
* +1025 * Пример
Рассмотрим массив значений a
, показателей i
, а также суммы индекса и значения v
.
i -> 0 1 2 3 4 5 6 7 8 9 10 11 12
a -> [4, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
v -> 4 12 3 4 5 6 7 8 9 10 11 12 13
Начните с индекса 0 и рассмотрите следующие 4 элемента. Найдите тот с максимальным v
. Этот элемент имеет индекс 1, поэтому перейдите к 1. Теперь рассмотрим следующие 11 элементов. Цель в пределах досягаемости, поэтому прыгайте к цели.
Демо
См. здесь или здесь с кодом .