每日一题.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<Integer> 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;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 ...
    one_zheng阅读 226评论 0 0
  • 在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i...
    vbuer阅读 198评论 0 0
  • 在一条环路上有N个加油站,其中第i个加油站有汽油gas[i]升。 你有一辆油箱容量无限的的汽车,从第i个加油站开往...
    天云逝光阅读 277评论 0 0
  • 134 Gas Station 加油站 Description:There are N gas stations ...
    air_melt阅读 221评论 0 0
  • 本题考察的是最大子序列和 题目描述 在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你...
    小怪兽大作战阅读 2,011评论 0 1