每日一题.134. 加油站

在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。
说明:
如果题目有解,该答案即为唯一答案。
输入数组均为非空数组,且长度相同。
输入数组中的元素均为非负数。

我的解法:首先认为所有gas[i] > cost[i]的加油站i为可能的开始位置,然后依次从所有可能的开始位置出发行驶,判断汽车在当前汽油站i的剩余汽油量car是否大于或等于cost[i],若是,则说明汽车可以继续行驶到汽油站i+1,此时将汽车的剩余汽油量更新为car - cost[i] + gas[i+1],同时将路程dist + 1。循环判断汽车是否能够行驶到下一个加油站,若dist==N,说明汽车已经行驶了一周,返回汽车的出发位置;若汽车在行驶途中无法继续行驶到下一个加油站,则重新开始判断下一个开始位置,若汽车从所有开始位置出发都不能行驶一周,则返回-1。

时间复杂度:O(n2),空间复杂度:O(n)

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int len = gas.length;
        /*计算所有可能的开始位置*/
        List start = new LinkedList<>();
        for (int i = 0; i < len; i++) {
            if (gas[i] - cost[i] >= 0) {
                start.add(i);
            }
        }
        for (int currentStart : start) {
            int t = currentStart, car = gas[currentStart], dist = 0;
            /*当前汽油可以使汽车到达下一站*/
            while (car >= cost[t]) {
                car = car - cost[t] + gas[(t+1)%len];
                t = (t + 1) % len;
                dist += 1;
                /*当汽车已经行驶了一周*/
                if (dist == len) {
                    return currentStart;
                }
            }
        }
        return -1;
    }
}

你可能感兴趣的:(每日一题.134. 加油站)