题目描述:
在一条环路上有 n
个加油站,其中第 i
个加油站有汽油 gas[i]
升。
你有一辆油箱容量无限的的汽车,从第 i
个加油站开往第 i+1
个加油站需要消耗汽油 cost[i]
升。你从其中的一个加油站出发,开始时油箱为空。
给定两个整数数组 gas
和 cost
,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1
。如果存在解,则 保证 它是 唯一 的。
题解:
class Solution:
def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
if sum(gas)<sum(cost):
return -1
n=len(gas)
start=0
total=0
for i in range(n):
total+=gas[i]-cost[i]
if total<0:
start=i+1
total=0
return start
思路:
贪心算法
sum(gas)<sum(cost)sum(gas) < sum(cost)sum(gas)<sum(cost),即 总油量 < 总耗油量,题目一定无解;
sum(gas)>=sum(cost)sum(gas) >= sum(cost)sum(gas)>=sum(cost),题目一定有解,且保证有唯一解。
当题目有解时:
每个加油站的剩余量rest[i]为gas[i] - cost[i]。
i从0开始累加rest[i],和记为total,一旦total小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算total。