算法-加油站问题
hello 大家好!今天开写一个新章节,每一天一道算法题。让我们一起来学习算法思维吧!
function canCompleteCircuit(gas, cost) {
// 加油站的总数
const n = gas.length;
// 记录总剩余油量,若总剩余油量小于 0,说明无法绕环路行驶一周
let totalSurplus = 0;
// 记录当前从起始点出发累计的剩余油量
let currentSurplus = 0;
// 记录可能的起始加油站编号,初始设为 0
let start = 0;
// 遍历每一个加油站
for (let i = 0; i < n; i++) {
// 计算从当前加油站出发到下一个加油站的剩余油量
const surplus = gas[i] - cost[i];
// 累加每一个加油站的剩余油量到总剩余油量中
totalSurplus += surplus;
// 累加从当前起始点出发到当前加油站的剩余油量
currentSurplus += surplus;
// 如果当前从起始点出发累计的剩余油量小于 0,说明从当前 start 出发无法继续行驶
if (currentSurplus < 0) {
// 则更新起始点为下一个加油站
start = i + 1;
// 并将当前累计的剩余油量重置为 0,准备从新的起始点开始计算
currentSurplus = 0;
}
}
// 如果总剩余油量小于 0,说明整体的汽油量不足以支持绕环路行驶一周
if (totalSurplus < 0) {
return -1;
}
// 否则,返回记录的起始加油站编号
return start;
}
// 示例测试
const gas = [1, 2, 3, 4, 5];
const cost = [3, 4, 5, 1, 2];
console.log(canCompleteCircuit(gas, cost));
代码思路解释
初始化部分:
n:获取加油站的总数,用于后续的循环遍历。
totalSurplus:用来统计所有加油站的汽油量减去行驶消耗后的总剩余油量。如果这个值小于 0,说明无论从哪个加油站出发,都无法绕环路行驶一周。
currentSurplus:记录从当前假设的起始加油站出发,到当前遍历到的加油站时累计的剩余油量。
start:表示可能的起始加油站编号,初始从 0 号加油站开始尝试。
遍历加油站:
在循环中,对于每一个加油站,计算从该加油站出发到下一个加油站的剩余油量 surplus,即 gas[i] - cost[i]。
将这个剩余油量累加到 totalSurplus 中,以统计总的剩余油量情况。
同时也将其累加到 currentSurplus 中,以跟踪从当前假设的起始点出发的剩余油量变化。
若 currentSurplus 小于 0,意味着从当前假设的 start 出发无法到达下一个加油站,所以更新 start 为下一个加油站的编号 i + 1,并将 currentSurplus 重置为 0,重新开始从新的起始点计算剩余油量。
结果判断:
循环结束后,检查 totalSurplus 的值。如果它小于 0,说明整体汽油量不够绕环路行驶,返回 -1。
若 totalSurplus 大于等于 0,说明存在一个起始点可以绕环路行驶一周,返回记录的 start 编号。