Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[leetcode]134.加油站 #35

Open
MagicalBridge opened this issue Jan 7, 2021 · 0 comments
Open

[leetcode]134.加油站 #35

MagicalBridge opened this issue Jan 7, 2021 · 0 comments
Labels
documentation Improvements or additions to documentation

Comments

@MagicalBridge
Copy link
Owner

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

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

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

说明:

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

示例 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 可为起始索引。

示例 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 升汽油。
因此,无论怎样,你都不可能绕环路行驶一周。

思路:

我们首先需要明白一件事情,要走完整个环的前提是gas的总量要大于cost的总量,这样才能有机会走完全程,在这种前提条件下,才会有题目中所说的起点的存在。

假设开始的时候设置的起点是start,从这里出发,如果当前的gas值大于cost值,就可以继续前进,此时到了下一个站点,剩余的gas加上当前的gas再减去cost是否大于零。

如果大于零,则继续前进,当达到某一个站点的时候,如果这个值小于0,则说明起点从这个点的中间的任何一个点都不能作为起点。

这个时候我们需要将下一个点作为起点,继续遍历,当遍历完整个环的时候,当前保存的起点就是所要求的点。

用实际的例子来说明一下

start 初始设置为0
循环gas这个数组
i = 0的时候 gas[0] = 1, cost[0] = 3 => curr < 0 说明消耗的油多余存量,无法达到目的地 不符合条件,继续下一个。
start 变为 1 将 curr 重置为0;

/**
 * @param {number[]} gas
 * @param {number[]} cost
 * @return {number}
 */
var canCompleteCircuit = function(gas, cost) {
  let total = 0; // 总的剩余油料
  let curr = 0;  // 当前站点的剩余油料
  let start = 0; // 起始点
  for(let i = 0; i < gas.length; i++) {
    curr += gas[i] - cost[i];
    if (curr < 0) {
      start = i + 1;
      curr = 0;
    }
    total += gas[i] - cost[i]
  }
  return total >= 0 ? start: -1;
};

时间复杂度:O(N) 遍历了一遍数组
空间复杂度:O(1) 开辟了常数级别的空间

@MagicalBridge MagicalBridge added the documentation Improvements or additions to documentation label Jan 7, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
documentation Improvements or additions to documentation
Projects
None yet
Development

No branches or pull requests

1 participant