加油站

leetcode134 加油站

算法

  •  引入变量curr_gas:记录当前邮箱里剩余的总油量,如果在某一个加油站curr_gas的值小于0, 意味着我们无法达到这个加油站,下一步我们把这个加油站当做新的起点,并将curr_gas重置为0,表示重新出发。
  • 引入变量total_gas = sum(gas) - sum(cost),如果total_gas < 0,则直接返回-1, 因为一定不可能环形一圈。
  1. 初始化total_gas和curr_gas为0,并且选择0号加油站为起点
  2. 遍历所有的加油站
    1. 每一步中,total_tank += gas[i] - cost[i], curr_gas += gas[i] - cost[i]
    2. 如果在i + 1号加油站,curr_gas< 0,将i + 1号加油站作为新的起点,同时重置curr_gas = 0, 让油箱也清空
  3. 如果total_gas < 0,返回-1,否则返回starting station,N_s

证明N_s为一个可行解

N_s为可行解, 现要证明N_sN_{s-1}一定是可达的,因为cur_gas > 0, 意味着N_sN一定可达,采用反证法:

N_sN_{s-1}不可达,那么不可达的位置k一定满足1\leqslant k \leqslant N_s-1, 可以将整条回路分成三段。

N_s为可行解,则total_gas>=0, 因此

\sum_{i-1}^{i=N} \alpha_i = \sum_{i=1}^{i=k} \alpha_i + \sum_{i=k+1}^{i=N_s-1} \alpha_i + \sum_{i=N_s}^{i=N} \alpha_i \geq 0 \\\alpha_i=gas(i) - cost(i)

\sum_{i=k+1}^{i=N_s-1} \alpha_i\leq 0一定成立,因为如果反之的话,得到的结果出发点一定在N_s更靠前的一个加油站,而不是N_s

所以\sum_{i=1}^{i=k} \alpha_i + \sum_{i=N_s}^{i=N} \alpha_i \geq 0 \\ 恒成立

又根据假设可知,N_s不能到达k,N_s - k可以分成N_s-N1-k两部分,因此

\sum_{i=N_s}^{i=N} \alpha_i + \sum_{i=1}^{i=k} \alpha_i < 0 \\

于上式矛盾,假设不成立,从N_s出发一定能环形一圈,N_s是一个可行解。

代码实现

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int n = gas.length;
        int total_gas = 0;
        int cur_gas = 0;
        int res = 0;
        for(int i = 0; i < n; i++){
            total_gas += gas[i] - cost[i];
            cur_gas += gas[i] - cost[i];
            if(cur_gas < 0){
                res = i + 1;
                cur_gas = 0;
            }
        }
        return total_gas < 0 ? -1 : res;
    }
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值