LeetCode134. 加油站

127 阅读2分钟

LeetCode134. 加油站

 # 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。给定两个整数数组 gas 和 cost ,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。
 ​
  
 示例 1:
 ​
 输入: gas = [1,2,3,4,5], cost = [3,4,5,1,2]
 输出: 3
 解释:
 从 3 号加油站(索引为 3 处)出发,可获得 4 升汽油。此时油箱有 = 0 + 4 = 4 升汽油
 开往 4 号加油站,此时油箱有 4 - 1 + 5 = 8 升汽油
 开往 0 号加油站,此时油箱有 8 - 2 + 1 = 7 升汽油
 开往 1 号加油站,此时油箱有 7 - 3 + 2 = 6 升汽油
 开往 2 号加油站,此时油箱有 6 - 4 + 3 = 5 升汽油
 开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。
 因此,3 可为起始索引。
 示例 2:
 ​
 输入: gas = [2,3,4], cost = [3,4,3]
 输出: -1
 解释:
 你不能从 0 号或 1 号加油站出发,因为没有足够的汽油可以让你行驶到下一个加油站。
 我们从 2 号加油站出发,可以获得 4 升汽油。 此时油箱有 = 0 + 4 = 4 升汽油
 开往 0 号加油站,此时油箱有 4 - 3 + 2 = 3 升汽油
 开往 1 号加油站,此时油箱有 3 - 3 + 3 = 3 升汽油
 你无法返回 2 号加油站,因为返程需要消耗 4 升汽油,但是你的油箱只有 3 升汽油。
 因此,无论怎样,你都不可能绕环路行驶一周。
  
 ​
 提示:
 ​
 gas.length == n
 cost.length == n
 1 <= n <= 105
 0 <= gas[i], cost[i] <= 104

解题思路

直观理解,不用公式推导。可以这样想:假设从x加油站出发经过z加油站最远能到达y加油站,那么从z加油站直接出发,不可能到达y下一个加油站。因为从x出发到z加油站时肯定还有存储的油,这都到不了y的下一站,而直接从z出发刚开始是没有存储的油的,所以更不可能到达y的下一站。

代码

 public int canCompleteCircuit(int[] gas, int[] cost) {
 ​
         int i = 0;
         int len = gas.length;
 ​
         while (i < len){
 ​
             int gasNum = 0, costNum = 0, cnt = 0;
 ​
             while (cnt < len){
                 int j = (cnt + i) % len;
                 gasNum += gas[j];
                 costNum += cost[j];
                 if (costNum > gasNum) break;
                 cnt++;
             }
 ​
             if (cnt == len){
                 return i;
             }else {
                 i = i + 1 + cnt;
             }
 ​
         }
 ​
         return -1;
 ​
 ​
     }

运行结果

image.png