Leetcode 134. 加油站(中等) 贪心算法

labuladong讲解

 

134. 加油站(中等)

题目:

 

 思路:

就是每到达一个站点i,可以加gas[i]升油,但离开站点i需要消耗cost[i]升油,问你从哪个站点出发,可以兜一圈回来

汽车进入站点i可以加gas[i]的油,离开站点会损耗cost[i]的油,那么可以把站点和与其相连的路看做一个整体,将gas[i] - cost[i]作为经过站点i的油量变化值:

有了这个环形数组,我们需要判断这个环形数组中是否能够找到一个起点start,使得从这个起点开始的累加和一直大于等于 0

如果把这个「最低点」作为起点,就是说将这个点作为坐标轴原点,就相当于把图像「最大限度」向上平移了

 

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int n=gas.size();
        //记录累计的剩余油量
        int sum=0;
        //记录起点
        int start=0;
        //记录剩余油量的最小值
        int minSum=0;
        for(int i=0;i<n;++i){
            sum+=gas[i]-cost[i];
            //如果剩余油量小于最小值,更新起点跟最小值
            //目的是找出累计油量最小的位置,并将起点更新至i+1
            //这样保证可以到达最低点
            // 经过第 i 个站点后,使 sum 到达新低
            // 所以站点 i + 1 就是最低点(起点)
            if(sum<minSum){
                start=i+1;
                minSum=sum;
            }
        }
        //如果总剩余小于0,意味着不能走完
        if(sum<0) return -1;
        //由于有环,start==n也就是0
        return start==n?0:start;
    }
};

 

posted @ 2022-03-04 20:44  鸭子船长  阅读(93)  评论(0编辑  收藏  举报