加油站
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
自己的想法:
贪心
- 遍历加油站,找出每一个路径,再进行判断当前油量是否小于0,从而找到最终路线
- 最容易想到的解法是:从头到尾遍历每个加油站,并检查以该加油站为起点,最终能否行驶一周。我们可以通过减小被检查的加油站数目,来降低总的时间复杂度。
为什么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/
感想: 暴力解法,时间过长。