leetcode 134

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个点也得到了证明.

  数学归纳法告诉我们这个结论是正确的

原文地址:https://www.cnblogs.com/mangmangbiluo/p/15116681.html