
代码贪心:
- 遍历每一个加油站,判断是否可以绕环路一圈
- 但可以发现,从 a 点起,最多到达 b 点,两点中间的 点,最多也是到达 b 点
- 故而我们从 0 开始遍历,找到最远可以到达的位置,我们从这个最远位置接着往下遍历,其中间的点位无需判断
- sumofgas 表示当前位置为止所得到的总油量,sumofcost 表示往下一个加油站为止所需要消耗的总油量,所以当前者小于后者则到不了下一个位置,跳出循环,
- cut 作为计数变量,计算当前通过了几个加油站,我们的目的是让cnt 等于 n,也就是满足绕一圈,
- j 表示当前所在的位置,j 通过
(i + cnt) % n得到,因为保证模拟绕圈
- 跳出循环后判断是因为什么跳出循环的, 做出对应的操作,
func canCompleteCircuit(gas []int, cost []int) int {
for i, n := 0, len(gas); i < n; {
sumOfGas, sumOfCost, cnt := 0, 0, 0
for cnt < n {
j := (i + cnt) % n
sumOfGas += gas[j]
sumOfCost += cost[j]
if sumOfCost > sumOfGas {
break
}
cnt++
}
if cnt == n {
return i
} else {
i += cnt + 1
}
}
return -1
}