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

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

  • 相关阅读:
    AutoFac学习笔记
    AutoMapper学习笔记
    ROSLYN 查看C#方法执行次数
    log4net 动态创建文件名
    WPF可切换按钮,iOS风格
    咕咕咕
    贪吃的小J
    UK Day15
    UK Day15
    UK Day15
  • 原文地址:https://www.cnblogs.com/mangmangbiluo/p/15116681.html
Copyright © 2020-2023  润新知