zoukankan      html  css  js  c++  java
  • 【LeetCode练习题】Gas Station

    Gas Station

    There are N gas stations along a circular route, where the amount of gas at station i is gas[i].

    You have a car with an unlimited gas tank and it costs cost[i] of gas to travel from station i to its next station (i+1). You begin the journey with an empty tank at one of the gas stations.

    Return the starting gas station's index if you can travel around the circuit once, otherwise return -1.

    Note:
    The solution is guaranteed to be unique.

    题目意思:

    有N个加油站,gas[i]表示第i个加油站有多少汽油,cost[i]表示从第i个加油站去往第i+1个加油站要消耗多少汽油。开始的时候汽车里面没有汽油。

    返回某个(从0开始的)加油站,从这个加油站出发可以环绕N个加油站一周一直都有油。如果找不到,返回-1。

    解题思路:

    假设edge[i] = gas[i] - cost[i]。那么若edge[0] > 0,表示从0号加油站可以到达1号加油站。

    显然,如果edge[0]+edge[1]+edge[2]+edge[3]+edge[4]+edge[5]+edge[6]+edge[7]+edge[8]+edge[9] < 0,应该返回-1。

    我们考虑这样一种情况,从0号出发,0号可以到1号,然后到2号,然后到3号,当到达3号的时候我们发现0,1,2,3号加油站目前为止的gas[0],gas[1],gas[2],gas[3]的总和开始比cost[0],cost[1],cost[2],cost[3]小了,即edge[0]+edge[1]+edge[2]+edge[3] < 0。此时的油量将无法支撑我们开往4号加油站。

    这样的话,可以得出0号是不能作为起点的结论。

    那么1号可以作为起点吗?

    显然也不能!

    因为edge[0]+edge[1]+edge[2]+edge[3] < 0,而且我们已经知道了edge[0] > 0,那么很自然的可以知道edge[1]+edge[2]+edge[3] < 0必定成立,这样从1号开始出发的话,结局也一定是在3号加油站这里悲剧。

    那么2号,3号呢?一样也不能作为起点了。

    所以,我们应该直接考虑3号的下一个加油站4号作为新的起点,假设一共有10个加油站(0号到9号),当以4号为新起点的时候,如果一直遍历到9号,都没有出现问题,即

    edge[4]+edge[5]+edge[6]+edge[7]+edge[8]+edge[9] > 0,那么4号就是我们返回的结果了。

    代码如下:

    class Solution {
    public:
        int canCompleteCircuit(vector<int> &gas, vector<int> &cost) {
            int left=0;
            int totalLeft = 0;
            int start = 0;
            int len = gas.size();
            for(int i = 0; i < len; i++){
                left += gas[i] - cost[i];
                totalLeft += gas[i] - cost[i];
                if(left < 0){
                    start = i + 1;
                    left = 0;
                }
            }
            return totalLeft>=0? start:-1;
        }
    };
  • 相关阅读:
    win32汇编-Windows钩子(七)
    win32汇编-动态链接库(六)
    win32汇编-内存管理 (五)
    win32汇编-GDI 图形 (三)
    win32汇编-定时器与取本地时间 (四)
    win32汇编-窗口 对话框 (三)
    win32汇编数据结构(二)
    win32汇编入门(一)
    win驱动开发笔记-结构化异常处理
    判定IE 使用 css
  • 原文地址:https://www.cnblogs.com/4everlove/p/3652600.html
Copyright © 2011-2022 走看看