leetCode-加油站

879 阅读2分钟

算法记录

LeetCode 题目:

  在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。


说明

一、题目

  在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。

  你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。

  给定两个整数数组 gas 和 cost ,如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则保证它是唯一的。

二、分析

  • 按照题意的话,我们不得不去遍历整个数组从而判断从当前点出发是否能行驶一周回到起点,因为他的最终结果和起点有关。
  • 如果当前已有的油量不足以支撑到达下一个节点的耗油量,那么当前这次循环必然是错误的,这个判断值我们可以用 0 来作为界限。
  • 如果从当前点开始遍历能够正常回到当前点,那么当前点就可以作为一个出发点,这个时候的遍历就可以结束了。
  • 在进行内层的是否能够再次循环到当前节点的判断时有两种情况可能会退出当前的循环,一是已经达到了起点,也就是找到了这样的一个起点能够满足题目的要求,二是循环中间存在着无法到达的节点,所有在循环结束之后我们需要判断当前的循环是由什么原因退出的。
class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int n = gas.length;
        for(int i = 0; i < n; i++) {
            if(gas[i] < cost[i] || gas[i] == 0) continue;
            int max = gas[i] - cost[i], cycle = i + 1;
            while(cycle % n != i) {
                max += gas[cycle % n];
                max -= cost[cycle % n];
                if(max < 0) break;
                cycle++;
            }
            if(cycle % n == i) return i;
        }
        return -1;
    }
}

总结

题目没有什么的难点,注意边界条件的判断。