题目描述:
在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
*
* 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
*
* 给定两个整数数组 gas 和 cost ,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一
* 的。
输入: gas = [1,2,3,4,5], cost = [3,4,5,1,2] -2 -2 -2 3 3 -2 -4 -6 3 6
* 输出: 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 可为起始索引。
解题思路:
本来想的是双层遍历,因为没有明确只要有解一定是唯一解。超时了
我有 a b c 三个加油站,主要的疑问是 a 到不了 c ,为啥 能证明 b到不了 c ,因为 a 到 b 的最差的可能性是a一点多余的油没给b,到b的时候带了0油,不可能是负数,因为负数意味着到不了b就没油了,这样就证明b没有独立到达c的可能性。
解法一:
function canCompleteCircuit(gas, cost) {
// 记录每一次开始走剩余的汽油
let sum = 0;
// 记录从头到尾会耗费的汽油
let total = 0;
// 记录出发的位置
let start = 0;
// 题目说唯一解,因此如果损耗的汽油和获取的汽油总数>=0,根据题目一定存在唯一解
for (let i = 0; i < gas.length; i++) {
// 记录从头到位还剩多少汽油
total += gas[i] - cost[i];
// 记录每次开始的过程中剩余的汽油量
sum += gas[i] - cost[i];
// 一旦走到这一站汽油数小于0
// 证明从开始的加油站到下一个加油站之间的加油站都走不到下一个加油站,直接从下一个加油站开始出发。
if (sum < 0) {
start = i + 1;
sum = 0;
continue;
}
}
// 如果走到了最后一个加油站发现总汽油收支不能平衡,说明不成立
if (total < 0) {
return -1;
} else {
// 收支平衡返回出发的位置
return start;
}
};
用时:
// Your runtime beats 60.87 % of typescript submissions
// Your memory usage beats 57.97 % of typescript submissions (52.2 MB)