LintCode 187-加油站

本人电子系,只为一学生。心喜计算机,小编以怡情。


在一条环路上有 N 个加油站,其中第 i 个加油站有汽油gas[i],并且从第i个加油站前往第i+1个加油站需要消耗汽油cost[i]。

你有一辆油箱容量无限大的汽车,现在要从某一个加油站出发绕环路一周,一开始油箱为空。

求可环绕环路一周时出发的加油站的编号,若不存在环绕一周的方案,则返回-1。

注意事项
数据保证答案唯一。

样例
现在有4个加油站,汽油量gas[i]=[1, 1, 3, 1],环路旅行时消耗的汽油量cost[i]=[2, 2, 1, 1]。则出发的加油站的编号为2。


思考:起初我打算用循环链表来做这道题,可是这样就太麻烦了。于是我想到了用取模的方法,变相的实现了循环的功能。


其次,这里有个数学技巧
1, 1, 3, 1
2, 2, 1, 1

假设从下标2开始,即起初有3单位汽油能够循环一周

即 3-1+1-2+1-2+1-1>0

也就是说最多加减七次,我们可以int count=2*gas.length-1;

如果七次后累和的中间过程即最终结果都>=0,就是我们想要的

否则,就换下个一个起始点

public int canCompleteCircuit(int[] gas, int[] cost) {
            // write your code here

        for(int i=0;i<gas.length;i++)//每个起始点,这里以下标2为例
        {
            int count=2*gas.length-1;//计数,例子是7次
            int start=gas[i];//刚开始有3单位汽油
            int sum=start;//累和也是刚开始3单位
            int j=i;//j用来下面循环-1+1-2+1-2+1-1的过程
            while(count--!=0)
            {
                sum=sum-cost[j%cost.length];
                if(sum<0)//中间过程如果有<0,则证明这个点不能循环一周,退出while
                    break;
                sum+=gas[(j+1)%cost.length];//否则继续
                j++;//j指向下一个点
            }
            if(sum<0) //这里对应while里的break,即这个点不合适,换下一个点
                continue;
            if(sum>=0) //表示当前点历经七次还能大于零,就是我们想要的
                return i;
        }
        return -1;//四个点都循环一边没找到,只能return -1了

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值