列表

详情


134. 加油站

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

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

给定两个整数数组 gascost ,如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -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 升汽油。
因此,无论怎样,你都不可能绕环路行驶一周。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int canCompleteCircuit(vector<int>& gas, vector<int>& cost) { } };

java 解法, 执行用时: 2 ms, 内存消耗: 55.4 MB, 提交时间: 2024-10-06 07:47:07

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int ans = 0;
        int minS = 0; // 最小油量
        int s = 0; // 油量
        for (int i = 0; i < gas.length; i++) {
            s += gas[i] - cost[i]; // 在 i 处加油,然后从 i 到 i+1
            if (s < minS) {
                minS = s; // 更新最小油量
                ans = i + 1; // 注意 s 减去 c 之后,汽车在 i+1 而不是 i
            }
        }
        // 循环结束后,s 即为 gas 之和减去 cost 之和
        return s < 0 ? -1 : ans;
    }
}

cpp 解法, 执行用时: 92 ms, 内存消耗: 108.7 MB, 提交时间: 2024-10-06 07:46:54

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int ans = 0, min_s = 0, s = 0;  // s 表示油量,min_s 表示最小油量
        for (int i = 0; i < gas.size(); i++) {
            s += gas[i] - cost[i]; // 在 i 处加油,然后从 i 到 i+1
            if (s < min_s) {
                min_s = s; // 更新最小油量
                ans = i + 1; // 注意 s 减去 c 之后,汽车在 i+1 而不是 i
            }
        }
        // 循环结束后,s 即为 gas 之和减去 cost 之和
        return s < 0 ? -1 : ans;
    }
};

javascript 解法, 执行用时: 77 ms, 内存消耗: 59.5 MB, 提交时间: 2024-10-06 07:46:39

/**
 * @param {number[]} gas
 * @param {number[]} cost
 * @return {number}
 */
var canCompleteCircuit = function(gas, cost) {
    let ans = 0, minS = 0, s = 0; // s 表示油量,minS 表示最小油量
    for (let i = 0; i < gas.length; i++) {
        s += gas[i] - cost[i]; // 在 i 处加油,然后从 i 到 i+1
        if (s < minS) {
            minS = s; // 更新最小油量
            ans = i + 1; // 注意 s 减去 c 之后,汽车在 i+1 而不是 i
        }
    }
    // 循环结束后,s 即为 gas 之和减去 cost 之和
    return s < 0 ? -1 : ans;
};

rust 解法, 执行用时: 8 ms, 内存消耗: 3.1 MB, 提交时间: 2024-10-06 07:46:20

impl Solution {
    pub fn can_complete_circuit(gas: Vec<i32>, cost: Vec<i32>) -> i32 {
        let mut ans = 0;
        let mut min_s = 0; // 最小油量
        let mut s = 0; // 油量
        for (i, (g, c)) in gas.iter().zip(cost.iter()).enumerate() {
            s += g - c; // 在 i 处加油,然后从 i 到 i+1
            if s < min_s {
                min_s = s; // 更新最小油量
                ans = i + 1; // 注意 s 减去 c 之后,汽车在 i+1 而不是 i
            }
        }
        // 循环结束后,s 即为 gas 之和减去 cost 之和
        if s < 0 { -1 } else { ans as _ }
    }
}

golang 解法, 执行用时: 24 ms, 内存消耗: 2.9 MB, 提交时间: 2020-11-18 20:12:51

func canCompleteCircuit(gas []int, cost []int) int {
    ans, n := -1, len(gas)
    for i := 0; i < n; i++ {
        res := 0
        for j := i; j < n+i; j++ {
            if j < n {
                res += gas[j] - cost[j]
             } else {
                res += gas[j-n] - cost[j-n]
             }
            if res < 0 {
                break
            }
        }
        if res >= 0 {
            ans = i
            break
        }
    }
    return ans
}

python3 解法, 执行用时: 2428 ms, 内存消耗: 14 MB, 提交时间: 2020-11-18 20:10:16

class Solution:
    def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
        # 题目转化成dp问题
        ans, n = -1, len(gas)
        for i in range(n):
            res = 0
            for j in range(i, n+i):
                res += gas[j] - cost[j] if j < n else gas[j-n] - cost[j-n]
                if res < 0:
                    break
            if res >= 0:
                ans = i
                break
        return ans

上一题