贪心
首先,总油量 ≥ 总消耗量是存在解得充分必要条件。
证明:
设 net[i] = gas[i] - cost[i](每个加油站的净收益)
条件1:必要性
如果总油量 < 总消耗量,即 Σnet[i] < 0
那么无论如何选择起点,总油量都不够绕一圈
必要条件成立
**条件2:充分性
假设 Σnet[i] ≥ 0,但不存在任何起点可以完成环路。
这意味着:对于每一个可能的起点 k,在绕行过程中都会在某个点出现油量不足。
假设从起点 k出发,在到达点 m时第一次出现油量不足,那么:
- 从
k到m的净收益总和 < 0 - 由于总净收益 ≥ 0,那么从
m回到k的净收益总和必须 > 0 - 矛盾!因为如果从
m回到k的净收益 > 0,那么从m出发应该能够完成环路
充分条件成立
因此,只需要
1 统计总油量 ≥ 总消耗量
2 满足 1 的时候找到起点,实现方式为当我们发现某段路程总消耗量 ≥总油量为负时候把下一个当作起点即可
时间复杂度:$O(n)$
空间复杂度:$O(1)$
1 | class Solution { |