LeetCode-加油站

题意

即有一个无限油箱的小车在很长的一段环路上行驶,途中有加油站,加油站可以补给一次汽油,小车刚开始没有油,可以任意选择某个加油站作为出生点,问小车在哪个点能够绕环路一圈?若存在,请给出第一个点的位置

输入:
①加油站储存的汽油数
②加油站之间的汽油损耗数
输出:
第一个可行加油站的位置或不存在,即-1

思路

如果用暴力解法,可以在 O ( N 2 ) O(N^2) O(N2)时间复杂度解决,但是可以观察到计算不同出生点的过程中包含一些重复的计算量,因此启发我们可以根据之前点的计算跳过后续某些加油站

参考证明

证:对于某一个点 x x x,其第一次无法到达的点为y,这表明
∑ i = x y g a s [ i ] < ∑ i = x y c o s t [ i ] \sum_{i=x}^{y}gas[i]<\sum_{i=x}^{y}cost[i] i=xygas[i]<i=xycost[i]

∑ i = x j g a s [ i ] ≥ ∑ i = x j c o s t [ i ] \sum_{i=x}^{j}gas[i] \ge \sum_{i=x}^{j}cost[i] i=xjgas[i]i=xjcost[i]其中 j j j表示 [ x , y ) [x,y) [x,y)中任意一点


那么我们也可以证明 [ x , y ) [x,y) [x,y)中任意一点 j j j也无法到达 y y y
∑ i = j y g a s [ i ] = ∑ i = x y g a s [ i ] − ∑ i = x j − 1 g a s [ i ] \sum_{i=j}^{y}gas[i]=\sum_{i=x}^{y}gas[i]-\sum_{i=x}^{j-1}gas[i] i=jygas[i]=i=xygas[i]i=xj1gas[i] < ∑ i = x y c o s t [ i ] − ∑ i = x j − 1 c o s t [ i ] = ∑ i = j y c o s t [ i ] <\sum_{i=x}^{y}cost[i]-\sum_{i=x}^{j-1}cost[i]=\sum_{i=j}^{y}cost[i] <i=xycost[i]i=xj1cost[i]=i=jycost[i]


所以我们在判断某点无法环绕一圈时,也判断了之间的点无法环绕一圈,这样每个点只需要计算一遍,时间复杂度降低至 O ( N ) O(N) O(N)

代码

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        for (int i=0;i< gas.length;i++) {
            int j = i, count = 0;
            while (j<i+ gas.length) {
                count += gas[j% gas.length]-cost[j% gas.length];
                if (count<0) {
                    break;
                }
                j++;
            }
            if (j==i+ gas.length) {
                return i;
            } else {
                i=j;
            }
        }
        return -1;
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值