代码随想录第三十三天 | 134. 加油站

81 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情

134. 加油站

题目分析

题目给出环路上的n个加油站,每个加油站有汽油。从一个加油站到下一个加油站要消耗汽油,每个加油站都可以加汽油。判断是否可以绕环路行驶一周,如果有站的编号,如果不可以返回-1。

解题

解法一

因为这个环路可以看成一个环,通过从每一个加油站出发遍历每一种情况。判断是否可以绕环路行驶。

我们可以通过for循环遍历每一个加油站模拟从加油站出发,再通过while循环向下行驶。由于路是一个环,在计算加油站i值的时候,需要加以注意。通过下面这种方式求出下一个加油站的i值。

let index = (i + 1) % cost.length

解法二

首先我们要知道,如果汽油的总和小于消耗汽油的总和,那么无论从哪个加油站出发都不能让环路行驶一圈。

如果从第1个加油站出发,每一个加油站的油的数总量大于消耗油的总量,那么可以知道第1个加油站就是起点。

第3种情况就是在行程中,如果有哪一个加油站加油的总量与消耗油的差能填补上加油站油的总量与消耗油的总量差最小的,那么这个加油站就是出发的加油站。

代码如下:

var canCompleteCircuit = function(gas, cost) {
    let curSum = 0,min = Infinity
    for(let i = 0; i < gas.length; i++) {
        let rest = gas[i] - cost[i]
        curSum += rest
        if(curSum < min) {
            min = curSum
        } 
    }
    if(curSum < 0) return -1
    if(min >= 0) return 0
    for(let i = gas.length - 1; i >=0; i--) {
        let rest = gas[i] - cost[i]
        min += rest
        if(min >= 0) return i
    } 
    return -1
};

总结

这道题的解法有些绕,还有一种贪心的解法,但是还在研究中,所以这篇文章就不列举。