134.加油站-力扣

34 阅读1分钟

思路

对于这个题目,脑海中首先想到贪心这个算法,但是捏,由于本人太菜了,了解还不深刻,选择使用数组遍历

条件

1.获得的汽油的量大于总油耗
2.车从i站能开到i+1

只要满足这俩条件,就有了哥.

解释

当cur小于0时,表明从ans位置出发到i位置为死路,这表明我们无法再进行下一步,所以我们切换思路,此时应将cur置零,ans改为i+1 如果最后total>= 0 即ans位置出发就满足题目说的要求,则返回ans,否则返回 -1.

补充

为什么当cur<0时应该将起始站点设为i+1?
因为i->i+1站耗油太大,此时设置起点站为i+1能解决这个问题,减少一站,剩余油量就更少,如果设置起点站为i前面的站点,那包不可能冲过i+1的.

```int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize){
    // total记录可获得的总油量-总油耗, cur记录当前油耗情况, ans记录出发位置
    int total = 0, cur = 0, ans = 0;
    for(int i=0;i<gasSize;i++)
    {
        total += (gas[i] - cost[i]);
        cur += (gas[i] - cost[i]);
        if(cur<0)
        {                          
            cur = 0;                       
            ans = i + 1;                    
        }
    }
return total<0?-1:ans;                                           
}