
Вам дается 0-индексированный массив целых чисел nums длины n. Изначально вы находитесь в nums[0].
Каждый элемент nums[i] представляет максимальную длину прямого перехода от индекса i. Другими словами, если вы находитесь в nums[i], вы можете перейти к любому nums[i + j], где:
0 <= j <= nums[i] и
i + j < n
Верните минимальное количество переходов для достижения nums[n - 1]. Тестовые примеры генерируются таким образом, что вы можете достичь nums[n - 1].
Входные данные: nums = [2,3,1,1,4]
Результат: 2
Пояснение: Минимальное количество переходов для достижения последнего индекса равно 2. Перейдите на 1 шаг от индекса 0 к 1, затем на 3 шага к последнему индексу.
Входные данные: nums = [2,3,0,1,4]
Результат: 2
class Solution {
public:
int jump(vector<int>& nums) {
int len = nums.size();
if(len == 1){
return 0;
}
int max = 0;
int curr = 0;
int count = 0;
for(int i = 0 ; i < len - 1 ; i++) {
if(i + nums[i] > max) {
max = i + nums[i];
}
if(curr == i) {
curr = max;
count++;
}
if(curr >= len-1) {
break;
}
}
return count;
}
};
Используются указатели:
curr – для отслеживания текущей максимально достижимой позиции
max – для отслеживания следующей максимально достижимой позиции.
Переменная count отслеживает количество прыжков, сделанных на данный момент.
На каждой итерации цикла for код обновляет max до максимума текущего max и достижимой позиции из текущего элемента i + nums[i].
Если curr достиг i, код обновляет curr до max и увеличивает count на 1. Если curr становится больше последнего индекса массива, функция возвращает count.
Пример: nums = [3,4,2,1,1,3,5,2,1]
| i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
|---|---|---|---|---|---|---|---|---|---|---|
| nums[i] | 3 | 4 | 2 | 1 | 1 | 3 | 5 | 2 | 1 |
лучший прыжок: 0 -> 1 -> 5 -> 8
| i | nums[i] | max | curr | count |
|---|---|---|---|---|
| 0 | 0 | 0 | ||
| 0 | 3 | 3 | 3 | 1 |
| 1 | 4 | 5 | 3 | 1 |
| 2 | 2 | 5 | 3 | 1 |
| 3 | 1 | 5 | 5 | 2 |
| 4 | 1 | 5 | 5 | 2 |
| 5 | 3 | 8 | 8 | 3 |