加油站

Posted Efve

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了加油站相关的知识,希望对你有一定的参考价值。

中英题面

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

  There are N gas stations along a circular route, where the amount of gas at station i is gas[i].

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

  You have a car with an unlimited gas tank and it costs cost[i] of gas to travel from station i to its next station (i+1). You begin the journey with an empty tank at one of the gas stations.

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

  Return the starting gas station‘s index if you can travel around the circuit once in the clockwise direction, otherwise return -1.

  说明: 

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

  Note:

    •   If there exists a solution, it is guaranteed to be unique.
    •   Both input arrays are non-empty and have the same length.
    •   Each element in the input arrays is a non-negative integer.

  示例 1:

  输入: 
  gas  = [1,2,3,4,5]
  cost = [3,4,5,1,2]

  输出: 3

  解释:
  从 3 号加油站(索引为 3 处)出发,可获得 4 升汽油。此时油箱有 = 0 + 4 = 4 升汽油
  开往 4 号加油站,此时油箱有 4 - 1 + 5 = 8 升汽油
  开往 0 号加油站,此时油箱有 8 - 2 + 1 = 7 升汽油
  开往 1 号加油站,此时油箱有 7 - 3 + 2 = 6 升汽油
  开往 2 号加油站,此时油箱有 6 - 4 + 3 = 5 升汽油
  开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。
  因此,3 可为起始索引。

  Example 1:

  Input: 
  gas  = [1,2,3,4,5]
  cost = [3,4,5,1,2]
  
  Output: 3
  
  Explanation:
  Start at station 3 (index 3) and fill up with 4 unit of gas. Your tank = 0 + 4 = 4
  Travel to station 4. Your tank = 4 - 1 + 5 = 8
  Travel to station 0. Your tank = 8 - 2 + 1 = 7
  Travel to station 1. Your tank = 7 - 3 + 2 = 6
  Travel to station 2. Your tank = 6 - 4 + 3 = 5
  Travel to station 3. The cost is 5. Your gas is just enough to travel back to station 3.
  Therefore, return 3 as the starting index.

  示例 2:

  输入: 
  gas  = [2,3,4]
  cost = [3,4,3]

  输出: -1

  解释:
  你不能从 0 号或 1 号加油站出发,因为没有足够的汽油可以让你行驶到下一个加油站。
  我们从 2 号加油站出发,可以获得 4 升汽油。 此时油箱有 = 0 + 4 = 4 升汽油
  开往 0 号加油站,此时油箱有 4 - 3 + 2 = 3 升汽油
  开往 1 号加油站,此时油箱有 3 - 3 + 3 = 3 升汽油
  你无法返回 2 号加油站,因为返程需要消耗 4 升汽油,但是你的油箱只有 3 升汽油。
  因此,无论怎样,你都不可能绕环路行驶一周。

  Example 2:

  Input: 
  gas  = [2,3,4]
  cost = [3,4,3]

  Output: -1

  Explanation:
  You can‘t start at station 0 or 1, as there is not enough gas to travel to the next station.
  Let‘s start at station 2 and fill up with 4 unit of gas. Your tank = 0 + 4 = 4
  Travel to station 0. Your tank = 4 - 3 + 2 = 3
  Travel to station 1. Your tank = 3 - 3 + 3 = 3
  You cannot travel back to station 2, as it requires 4 unit of gas but you only have 3.
  Therefore, you can‘t travel around the circuit once no matter where you start. 



算法

  设f[i] = gas[i] – cost[i]。

  无解当且仅当sum{f[i]} < 0。

  通过队列维护从每个加油站出发的f[i]的前缀和s[i],当s[i]恒为0时,则i为一个可行的起点。

  时间复杂度:

    O(N)

  空间复杂度:

    O(1)

 
代码
 1 class Solution:
 2     def canCompleteCircuit(self, gas, cost):
 3         """
 4         :type gas: List[int]
 5         :type cost: List[int]
 6         :rtype: int
 7         """
 8         n = len(gas)
 9         for i in range(n):
10             gas[i] -= cost[i]
11         if (sum(gas) < 0):
12             return -1
13         i = j = now = 0
14         while (True):
15             now += gas[i]
16             i = (i + 1) % n
17             if (i == j):
18                 return j
19             while (now < 0):
20                 now -= gas[j]
21                 j = (j + 1) % n

 

以上是关于加油站的主要内容,如果未能解决你的问题,请参考以下文章

Java 求解加油站

会加油代码管理流程

LeetCode第134题—加油站—Python实现

poj 2431 优先队列,贪心

CodeForces - 864C-Bus-(模拟加油站问题)

51nod1288汽油补给