LeetCode Solutions (161 серия деталей)
Это является частью серии объяснений решения LeetCode ( index ). Если вам понравилось это решение или нашли его полезным, Пожалуйста, нравится Этот пост и/или upvote Мое решение по сообщению на форумах LeetCode Анкет
Проблема LeetCode #45 (Medium): Прыжок Игра II
Описание:
( прыгнуть в : Идея решения Код : JavaScript | Python | Java | C ++
Учитывая множество неотрицательных целых чисел Nums
Вы первоначально расположены в первом индексе массива.
Каждый элемент в массиве представляет максимальную длину прыжка в этом положении.
Ваша цель – достичь последнего индекса в минимальном количестве прыжков.
Вы можете предположить, что вы всегда можете достичь последнего индекса.
Примеры:
Вход: | Nums = [ 2,3,1,1,4] |
Выход: | 2 |
Объяснение: | Минимальное количество прыжков до достижения последнего индекса составляет 2. Прыгните 1 шаг от индекса от 0 до 1, затем 3 шага до последнего индекса. |
Вход: | Nums = [ 2,3,0,1,4] |
Выход: | 2 |
Ограничения:
- 1. длиной
- 0 [i]^5
Идея:
( Прыгните к : Описание задачи Код : JavaScript | Python | Java | C ++
Поскольку каждый элемент нашего входного массива ( n ) представляет максимальную длину прыжка, а не определенную длину прыжка, это означает, что мы можем посетить любой индекс между текущим индексом ( i ) и i + n [i] Анкет Растягивая это до его логического вывода, мы можем безопасно итерация через N При отслеживании самого дальнего индекса ( следующий ) в любой момент ( Далее (следующий, i + n [i]) ) Мы будем знать, что нашли наше решение один раз Следующий достигает или передает последний индекс ( next.length – 1 ).
Трудность заключается в том, чтобы отслеживать, сколько прыжков требуется для достижения этой точки. Мы не можем просто посчитать количество раз, когда мы обновляем Следующий , как мы можем видеть, это происходит более одного раза, пока все еще находятся в диапазоне нынешних прыжков. На самом деле, мы не можем быть уверены в лучшем следующем прыжке, пока не достигнем конца текущего диапазона прыжков.
Итак, в дополнение к Следующий , нам также нужно отслеживать конечную точку Jump ( curr ), а также количество прыжков, взятых до сих пор ( ans ).
Поскольку мы захотим вернуть ANS В самой ранней возможности мы должны основывать его на Следующий , как отмечалось ранее. С тщательными начальными определениями для карт и следующий , мы можем начать нашу итерацию в i и Анс Без необходимости выражения возврата корпуса.
- Сложность времени: O (n) где n – длина n
- Сложность пространства: O (1)
Реализация:
Есть только незначительные различия в коде всех четырех языков.
Код JavaScript:
( Прыгните к : Описание задачи Идея решения
var jump = function(N) { let len = N.length - 1, curr = -1, next = 0, ans = 0 for (let i = 0; next < len; i++) { if (i > curr) ans++, curr = next next = Math.max(next, N[i] + i) } return ans };
Код Python:
( Прыгните к : Описание задачи Идея решения
class Solution: def jump(self, N: List[int]) -> int: Nlen, curr, nxt, ans, i = len(N) - 1, -1, 0, 0, 0 while nxt < Nlen: if i > curr: ans += 1 curr = nxt nxt = max(nxt, N[i] + i) i += 1 return ans
Код Java:
( Прыгните к : Описание задачи Идея решения
class Solution { public int jump(int[] N) { int len = N.length - 1, curr = -1, next = 0, ans = 0; for (int i = 0; next < len; i++) { if (i > curr) { ans++; curr = next; }; next = Math.max(next, N[i] + i); }; return ans; }; };
C ++ Код:
( Прыгните к : Описание задачи Идея решения
class Solution { public: int jump(vector& N) { int len = N.size() - 1, curr = -1, next = 0, ans = 0; for (int i = 0; next < len; i++) { if (i > curr) ans++, curr = next; next = max(next, N[i] + i); }; return ans; } };
LeetCode Solutions (161 серия деталей)
Оригинал: “https://dev.to/seanpgallivan/solution-jump-game-ii-cn3”