LeetCode解析---134. 加油站

题目:

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

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

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

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/gas-station
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

示例:

输入:
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 可为起始索引。

分析:

我们定义当前的油量curr_tank 和总油量total_tank ,总油量用来判断能不能走完一圈,当前油量为了确定以哪里为起点,首先,我们用一开始为起点,如果加的油可以支撑到下一个加油站,则循环,如果不行,我们就将当前的油量归零,以下一个加油站为起点,而前面的加油站n因为已经算过够支撑走到加油站n+1,所以不用管

class Solution {
  public int canCompleteCircuit(int[] gas, int[] cost) {
    int n = gas.length;

    int total_tank = 0;
    int curr_tank = 0;
    int starting_station = 0;
    for (int i = 0; i < n; ++i) {
      total_tank += gas[i] - cost[i];
      curr_tank += gas[i] - cost[i];
      // If one couldn't get here,
      if (curr_tank < 0) {
        // Pick up the next station as the starting one.
        starting_station = i + 1;
        // Start with an empty tank.
        curr_tank = 0;
      }
    }
    return total_tank >= 0 ? starting_station : -1;
  }
}

原创文章 15 获赞 2 访问量 365

猜你喜欢

转载自blog.csdn.net/weixin_46747130/article/details/105693584