力扣题解(加油站)

134. 加油站

在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。

你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。

给定两个整数数组 gas 和 cost ,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。

思路:

从i位置开始,用step表示可以移动的距离,当step=n的时候,表示可以走一圈,则返回i即可。利用a记录从i位置开始走step步后所剩下的汽油,若a>=0,则表示还能继续走,反之,则表示已经没油了,这样的话从i位置就不能实现走一圈。

优化:

当a<0的时候,可以知道在上述思路的情况下,是从i+1位置重新出发,但是从i位置到i+step不能通过,则从i+1位置到i+step一定也不能通过,因为既然可以从i到i+step,就表示i位置一定是能出发的,这就意味着gas[i]>=cost[i],而去掉gas[i]和cost[i]所带来的影响后,到从i+1到i+step的a一定更小,因为失去了gas[i]-cost[i]>0,因此可以直接从i+step+1位置处重新开始寻找。

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
    //  //n^2做法
    //  int n=gas.size();
    //  int l=0,r=0;
    //  for(int i=0;i<n;i++)
    //  {  
    //     int flag=0;
    //     int begin=i;
    //     int allgas=gas[i];
    //      while(1)
    //      {
    //         allgas-=cost[begin];
    //         if(allgas<0)
    //         break;
    //         begin++;
    //         begin%=n;
    //           if(begin==i)
    //      return i;
    //         allgas+=gas[begin];
           
    //      }
       
    //  }
    //  return -1;

    //n的做法?
    int n=gas.size();
    for(int i=0;i<n;i++)
    {
        int a=0;
        int step=0;
        for(;step<n;step++)
        {
            int index=(i+step)%n;
            a=a+gas[index]-cost[index];
            if(a<0)
            {   
                
                break;
            }
        }
        if(a>=0)
        return i;
        i+=step;


    }
  
    return -1;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值