zoukankan      html  css  js  c++  java
  • 20.11.18 leetcode134

    题目链接:https://leetcode-cn.com/problems/gas-station/

    题意:有n个加油站环形排列,每个加油站都可以获得数量为gas[i]的石油,但从该加油站出发抵达下一加油站需要消耗cost[i]的石油,问能否从一个加油站出发再回到该加油站,如果可以,输出序号最小的加油站编号,不可以,则输出-1.

    分析:我只想到了遍历这个想法,就去看了题解,题解也是遍历,但是它有一个优化,就是它证明了从加油站i出发如果最远能到达加油站j的话,那么从[i+1,j-1]这些加油站也都无法超过加油站j,在给出题解的证明思路前我先说一下直观感受。那就是从加油站i出发既然能够到达j,那么它肯定也可以到达[i+1,j-1](废话),换句话说,在到达[i+1,j-1]时,此时的油量肯定是大于等于0的,而直接从[i+1,j-1]出发,它们此时的油量都为0,故肯定不如从加油站i出发。

    接下来是题解的数学证明,我就直接放截图了。

     

     有了这个数学结论,我们在遍历时如果一个点不能跑完全程,那么下一次遍历直接从它不能到达的第一个点开始就可以了。

    class Solution {
    public:
        int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
            int ans=0;
            int n=gas.size();
            while(ans<n){
                int cnt=0;
                int sumg=0,sumc=0;
                while(cnt<n){
                    int j=(ans+cnt)%n;
                    sumg+=gas[j];
                    sumc+=cost[j];
                    if(sumc>sumg)break;
                    cnt++;
                }
                if(cnt==n)return ans;
                else ans=ans+cnt+1;
            }
            return -1;
        }
    };
  • 相关阅读:
    SAP组件和支持包的安装
    abap动态内表获取字段名
    ooalv设置保存格式
    READ_TEXT取的文本&变为 <(>&<)>了怎么办
    SAP后台作业相关表
    63013
    ABAP 对内表数据下载到EXCEL的几种方法
    vue 教程
    spring 注解@PathVariable
    MyBatis动态添加—trim标签
  • 原文地址:https://www.cnblogs.com/qingjiuling/p/14002749.html
Copyright © 2011-2022 走看看