Пусть cost
будет массивом затрат на следующую станцию, а gas
будет массивом того, сколько топлива мы можем заправить
Мы вычислим разницу между gas[i]
и cost[i]
,называется diff
, где i - текущая заправка, в которой мы находимся.
Если cost[i] > gas[i]
(или diff < 0
), это означает, что нам нужно иметь как минимум cost[i] - gas[i]
топлива при прибытии на станцию iчтобы добраться до следующей остановки, я + 1. Если cost[i] <= gas[i]
(diff >= 0
), это допустимая отправная точка, потому что мы можем начать без газа, заправиться и отправиться на следующую станцию.В худшем случае мы дойдем до следующей остановки с пустым баком.В лучшем случае у нас останется запас топлива, когда мы достигнем i + 1 (diff > 0
)
На самом деле нам не нужно начинать с одной станции, пройти через n автозаправочных станций, чтобы выяснить, есть лидействительный тур!Пока суммированное топливо> = итоговая стоимость, будет действительный тур.Так что нам просто нужно сделать O (n) проход массивов
Дополнительный анализ:
Case1: Tank опустится ниже 0
Это будетпроизойдет только на остановке, где diff < 0
.После этого может быть другая отправная точка, которая собирает достаточно топлива после прохождения одного раунда, чтобы пройти эту станцию.Однако все те станции, которые мы прошли ранее, не помогут, поэтому нам не нужно их рассматривать (см. Пояснение к случаю 2).
Случай 2: танк в настоящее время> = 0, но мы столкнулись с другой действительной отправной точкой
Мы можем смело игнорировать это, потому что:
A ——B —— C. Если B может достичь C, а A может достичь B, то A может достичь C.
Случай 3: танк в настоящее время> = 0, недопустимая начальная точка
Продолжить переход к следующему
Случай 4: удалось достичь исходной начальной точки!
Ууу!
def find_starting_station(gas, cost):
sum_gas = sum_cost = tank = start = 0
for i in range(0, len(gas)):
sum_gas += gas[i]
sum_cost += cost[i]
tank += gas[i] - cost[i]
if tank < 0:
tank = 0
start = i+1
if sum_gas < sum_cost:
return -1
return start