加油站

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

题解:
1.如果gas的总和小于cost总和,一定不能跑一整圈。
2.每个加油站剩余量rest[i] = gas[i] - cost[i]
3.i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,起始位置从i+1算起,再从0计算curSum。

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int curSum = 0;
        int totalSum = 0;
        int start = 0;
        for(int i = 0; i < gas.size(); i++)
        {
            curSum += gas[i] - cost[i];   //累计当前剩余油量
            totalSum += gas[i] - cost[i];  //累计全程剩余油量
            if(curSum < 0)
            {
                start = i + 1;
                curSum = 0;
            }
        }
        if(totalSum < 0)
            return -1;
        return start;

    }
};

方法二:

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int curSum = 0;
        int min = 0;
        for(int i = 0; i < gas.size(); i++)
        {
            int res = gas[i] - cost[i];
            curSum += res;
            if(curSum < min)
                min = curSum;

        }
        if(curSum < 0) return -1;  //gas的总和小于cost总和
        if(min >= 0) return 0;      //从0累加到最后一站,没有出现负数,说明从0出发,可以环绕一圈
        for(int i = gas.size() - 1; i >= 0; i--)  //累加的最小值是负数,则需要从非0节点出发,从后向前遍历,能把负数抵消的节点就是出发节点
        {
            int rest = gas[i] - cost[i];
            min += rest;
            if(min >= 0)
                return i;
            
        }
        return -1;

    }
};
posted @ 2021-06-14 11:07  张宵  阅读(27)  评论(0编辑  收藏  举报