class Solution: """ 只要总和是大于 0 的那么就一定可以找到这样的点, 可以用数学归纳法进行证明 """ def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int: if not gas: return -1 total_sum = 0 part_sum = 0 index = -1 for i, v1 in enumerate(gas): v2 = cost[i] diff = v1 - v2 total_sum += diff part_sum += diff if part_sum >= 0: if index == -1: index = i continue part_sum = 0 index = -1 if total_sum < 0: return -1 if index == -1: raise Exception return index
我是这样想的, 对于一个点而言, gas减去cost是这个点的盈余, 如果要成环 那么盈余的总和必须要大于等于 0;
把盈余是正的点叫做正数点, 同理得到负数点和非负点;
那么如果一个盈余总和大于等于0的圈是不是总是可以找到这样的起点呢?
1个数必然, 2个数也必然, 三个数的话. 因为盈余之和大于等于0, 所以我一定可以找到两个相邻点, 前一个点盈余是非负的, 并且两个点的盈余之和大于等于0; 可以这样想:
如果有两个非正点一定可以找到; 如果有两个负点, 因为总和大于等于0, 所以剩下的正数点一定是大于两个负数点的. 将这个正数点和紧接其后的负数点合并, 得证.
现在如果n个点满足, 如果盈余之和为非负, 一定可以找到某一个点, 从该点出发逆时针可以走通;
n+1个点的时候, 去找到这样的相邻两点, 第一个点是非负点, 然后两点之和同样非负. 容易找到, 将这两个点看做一个点, 那么n+1个点也得到了证明.
数学归纳法告诉我们这个结论是正确的