加油站

134. 加油站

题目描述:

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

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

如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。

说明:

如果题目有解,该答案即为唯一答案。
输入数组均为非空数组,且长度相同。
输入数组中的元素均为非负数。

class Solution:
    def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
        for i in range(len(cost)):
            now_gas = 0
            index = i
            count = 0
            while(now_gas >= 0):
                if count > 0 and index == i:
                    return i
                    break
                now_gas = now_gas + gas[index]
                now_gas -= cost[index]
                index += 1
                if index > len(cost) - 1:
                    index = 0
                    count += 1
        return -1

自己的想法:

贪心

  1. 遍历加油站,找出每一个路径,再进行判断当前油量是否小于0,从而找到最终路线
  2. 最容易想到的解法是:从头到尾遍历每个加油站,并检查以该加油站为起点,最终能否行驶一周。我们可以通过减小被检查的加油站数目,来降低总的时间复杂度。

为什么error:

解题思路:

1.双指针

思路很简单,设置两个指针,一个指向起始节点,一个当前节点。然后按下面规则运算:

初始化起始节点 start 和当前节点 cur 都为 i (可任意设,如 0)。
这个时候拥有的油量为 oil = gas[i],驶向下一节点所需要的油量为 cost[i]。
则如果 oil >= cost[i],那么我们就驶向下一节点,cur += 1,同时加满这个加油站的油 oil += gas[cur]。
如果 oil < cost[i],说明从当前这个 start 节点出发是不可能到达 cur 的下一节点的。那么,我们就将 start 节点向前移一位:start -= 1,即假设是从前一节点出发的。这时要记得加上从新的start所加的油和出发到下一节点损耗的油。 oil += gas[start] - cost[start]。
当两节点相邻时结束: cur + 1 == start。
返回时要注意当前剩的油能否从最后的节点行驶到起始点。
具体实现时要对于 cur 和 start 每次变化时,要加上一个对环的长度的取余。

详细实现见代码和里面的注释。
作者:siyewy
链接:https://leetcode-cn.com/problems/gas-station/solution/shuang-zhi-zhen-fa-shi-jian-fu-za-du-onkong-jian-f/
2.动态规划

基本思路是:当从一个出发点ii出发,到了j点发现gas_now < cost_now,此时可以断定:ii到j之前的所有出发点都不可行,因此选择j后面的出发点再出发。通过这种思路,可以直接跨过不可行的许多出发点,节约大量的时间。
说不准这个思路到底归在哪类算法里。只能说是尽最大可能利用探索过的路的信息吧。
作者:lizi-3v
链接:https://leetcode-cn.com/problems/gas-station/solution/gao-xiao-dai-ma-45mszuo-you-you-zhu-shi-by-lizi-3v/
感想:

​ 暴力解法,时间过长。

posted @ 2021-04-09 10:24  Tonka  阅读(47)  评论(0编辑  收藏  举报