加油站

题目

来源:力扣(LeetCode)
链接:加油站

解法一

使用二重循环, 从0到gasSize枚举i,从第i个加油站出发枚举,若可以到达下一个加油站,令j=i+1,记下每到下一个站剩下的油量,若油量小于0.,则无法绕环路一周,退出该层循环,否则开往下一个加油站。循环至j==i。
时间复杂度为O(n2)
代码

int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize){
    int curgas=0;
    for(int i=0;i<gasSize;i++){
        curgas=gas[i]-cost[i]; //能否达到第i+1个加油站
        if(curgas<0) continue;// 从第i个加油站出发无法绕环路一周
        int j=(i+1)%gasSize; 
        while(j!=i){
            curgas=curgas+gas[j]-cost[j];//开往下一个加油站剩下的油量
            if(curgas<0)
                break; //无法到达下一个加油站
            j=(j+1)%gasSize;
        }
        if(j==i)
           return i;
    }
    return -1;
} // o(n^2) 的复杂度
解法二
  • 在某个加油站,如果没有存储汽油,利用这个加油站加的油可否行驶至下一个加油站?如果不能,则不能当做起点。即gas[i]-cost[i]<0的加油站i是不能当做起点的。

  • 现在计算每个加油站出发到达下一个加油站后剩余的油量gas[i]-cost[i],并且将这些油量全部累加起来,可以发现,如果累加的油量大于等于0,则表明一定存在一个加油站,从这个加油站出发就可以环行一周。

  • 那么怎么找这个特殊的起点呢?动态地更新curGas和st,起点从0开始,并且累加剩余的油量,一旦扫描到curGas小于0,则说明从st出发无法到到达当前加油站更无法完成环行,所以curGas清零,st设置为下一个站的下标。直到循环结束,如果sumGas>0则st就是所要找的起点。

  • 可以得出时间复杂度O(n),空间复杂度O(1)。

int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize){
    int curGas=0;
    int sumRemainGas=0;
    int st=0;
    for(int i=0;i<gasSize;i++){
        sumRemainGas+=gas[i]-cost[i];
        curGas+=gas[i]-cost[i]; //存储从st站出发到第i+1站台剩下的油量
        if(curGas<0){ 
            st=i+1;
            curGas=0;
        }
    }
    if(sumRemainGas>=0)
        return st;
    else
        return -1;
} // o(n) 的复杂度
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值