Работа над алгоритмом под алгоритмом поиска минимального количества прыжков. Чтобы решить эту проблему, добавьте подробное описание проблемы и две версии кода. Я тестировал, и, похоже, обе версии работают, а моя вторая версия - это оптимизированная версия кода версии 1, которая заставляет меня начинаться с i=maxIndex
, кроме непрерывного увеличения, что может сэкономить время, не итерации всех слотов массива.поиск минимального количества прыжков
Вопрос в том, интересует ли мой код второй версии на 100% правильно? Если кто-нибудь найдет какие-либо логические проблемы, оцените, указав.
Постановка задачи
Учитывая массив неотрицательных целых чисел, вы изначально позиционировался на первый индекс массива.
Каждый элемент массива представляет вашу максимальную длину прыжка в этом положении.
Ваша цель - достичь последнего индекса в минимальном количестве прыжков.
Например: Учитывая массив А = [2,3,1,1,4]
Минимальное количество переходов, чтобы достигнуть последнего индекса равно 2. (Перейти 1 шаг от индекса 0 до 1, затем 3 шага до последнего индекса.)
Первая версия кода
class Solution {
public:
int jump(vector<int>& nums) {
int i = 0, n = nums.size(), step = 0, end = 0, maxend = 0;
while (end < n - 1) {
step++;
for (;i <= end; i++) {
maxend = max(maxend, i + nums[i]);
if (maxend >= n - 1) return step;
}
if(end == maxend) break;
end = maxend;
}
return n == 1 ? 0 : -1;
}
};
второй версии кода
class Solution {
public:
int jump(vector<int>& nums) {
int i = 0, n = nums.size(), step = 0, end = 0, maxend = 0;
int maxIndex = 0;
while (end < n - 1) {
step++;
for (i=maxIndex;i <= end; i++) {
if ((i + nums[i]) > maxend)
{
maxend = i + nums[i];
maxIndex = i;
}
if (maxend >= n - 1) return step;
}
if(end == maxend) break;
end = maxend;
}
return n == 1 ? 0 : -1;
}
};
спасибо заранее, Лин
Вот подсказка о том, как вы можете сделать эту проблему более сговорчивым, и, следовательно, более вероятно, другой поможет: Покажите нам рекуррентное соотношение, что делает ваше решение, а затем код, который предположительно сделай это. Таким образом, мы можем рассуждать об этом, а не разыгрывать разницу по процедурному коду. Наконец, можете ли вы подскочить до nums [i] вправо или только точно nums [i] вправо? –
Они оба дают одинаковый ответ каждый раз, когда он запускается, поэтому я предполагаю, что он работает. –
@JamesRoot, с вашим подтверждением, я более уверен. Если бы вы могли сделать ответ, я помечаю его как ответ, чтобы принести пользу и другим людям. :) –