泊头建网站,商城网站开发项目文档,阿里域名注册官网,Wordpress登录后顶部的黑文章目录 加油站思路一思路二思路三思路四思路五 加油站 在一条环路上有 n 个加油站#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发#xf… 文章目录 加油站思路一思路二思路三思路四思路五 加油站 在一条环路上有 n 个加油站其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发开始时油箱为空。 给定两个整数数组 gas 和 cost 如果你可以按顺序绕环路行驶一周则返回出发时加油站的编号否则返回 -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 升汽油。
因此无论怎样你都不可能绕环路行驶一周。思路一
function canCompleteCircuit(gas, cost) {let totalGas 0, totalCost 0, start 0, tank 0;for (let i 0; i gas.length; i) {totalGas gas[i];totalCost cost[i];tank gas[i] - cost[i];// 如果当前油量小于0说明从start点出发无法到达下一个加油站if (tank 0) {start i 1; // 更新起始点tank 0; // 清空油箱}}// 如果总的汽油量小于总的消耗量无法完成环路if (totalGas totalCost) {return -1;}return start;
}讲解 可以通过贪心算法解决主要的思路是寻找一个起始点从这个点出发汽车能够通过不断加油并且不耗尽油箱中的油完成整个环路的行驶。下面详细介绍解题思路和代码实现。 初始化变量totalGas 和 totalCost 分别用来累计所有加油站的汽油总量和消耗的汽油总量。start 用来记录可能的起始加油站的索引tank 则记录当前油箱里的油量。遍历加油站从第一个加油站开始遍历对于每个加油站做以下操作 ○ 更新油箱里的油量tank gas[i] - cost[i]。 ○ 如果油箱里的油量小于**0说明从当前的 start 点出发无法到达下一个加油站因此重置 start 点为下一个加油站的位置并清空油箱**start i 1 和 tank 0。 ○ 累计总汽油量和总消耗量totalGas gas[i] 和 totalCost cost[i]。判断能否完成环路如果 totalGas totalCost说明总的汽油量不足以完成整个环路的行驶返回 -1。否则从 start 点出发一定可以完成环路返回 start。 思路二
var canCompleteCircuit function (gas, cost) {const n gas.length;for (let start 0; start n; start) {let totalGas 0;let totalCost 0;let canComplete true;for (let i 0; i n; i) {const index (start i) % n;totalGas gas[index];totalCost cost[index];if (totalGas totalCost) {canComplete false;break;}}if (canComplete) {return start;}}return -1;
};讲解 这段代码定义了一个函数 canCompleteCircuit用于判断在一个环形路线上是否可以从某个加油站出发顺利完成一圈而不耗尽汽油。 输入参数函数接收两个数组 gas 和 cost分别表示每个加油站的汽油量和从一个加油站到下一个加油站所需的汽油量。获取加油站数量通过 gas.length 获取加油站的数量并存储在变量 n 中。外层循环遍历每一个加油站尝试将其作为出发点。循环变量 start 从 0 到 n-1。初始化变量 totalGas 用于记录从当前出发点出发的总汽油量。totalCost 用于记录从当前出发点到下一个加油站的总消耗量。canComplete 标记从当前起点出发是否可以完成一圈初始设为 true。 内层循环从当前起点出发遍历所有加油站。循环变量 i 从 0 到 n-1。 计算当前加油站的索引使用取模运算以实现环形效果。 累加汽油量和消耗量将当前加油站的汽油量加到 totalGas将消耗量加到 totalCost。检查能否继续行驶如果 totalGas 小于 totalCost说明无法继续行驶设置 canComplete 为 false并跳出内层循环。判断能否完成一圈如果 canComplete 仍为 true说明可以从当前起点出发完成一圈返回当前起点的索引。返回结果如果所有加油站都尝试过后仍然没有找到可以完成一圈的起点返回 -1表示无法完成。 思路三
var canCompleteCircuit function (gas, cost) {const n gas.length;const prefix new Array(n 1).fill(0);for (let i 0; i n; i) {prefix[i 1] prefix[i] gas[i] - cost[i];}let minPrefix Infinity;let startIndex 0;for (let i 1; i n; i) {if (prefix[i] minPrefix) {minPrefix prefix[i];startIndex i;}}return prefix[n] 0 ? (startIndex % n) : -1;
};讲解 这段代码实现了一个函数 canCompleteCircuit用于判断在一个环形路线上是否可以从某个加油站出发顺利完成一圈而不耗尽汽油。 输入参数函数接收两个数组 gas 和 cost分别表示每个加油站的汽油量和从一个加油站到下一个加油站所需的汽油量。获取加油站数量通过 gas.length 获取加油站的数量并存储在变量 n 中。初始化前缀数组创建一个长度为 n 1 的数组 prefix并用 0 填充。这个数组用于存储从起点到每个加油站的净汽油量汽油量减去消耗量。计算前缀和 使用循环遍历每个加油站更新 prefix 数组。prefix[i 1] 存储到达第 i 个加油站后的净汽油量。计算公式为 prefix[i 1] prefix[i] gas[i] - cost[i]。 寻找最小前缀和 初始化 minPrefix 为正无穷startIndex 为 0。再次遍历 prefix 数组寻找最小的前缀和并记录其索引 startIndex。 判断是否可以完成一圈 如果 prefix[n]即完成一圈后的净汽油量大于等于 0说明可以完成一圈返回 startIndex % n 作为起点。如果 prefix[n] 小于 0返回 -1表示无法完成。 思路四
var canCompleteCircuit function (gas, cost) {const n gas.length;let totalGas 0;let totalCost 0;let currentGas 0;let startIndex 0;for (let i 0; i n; i) {totalGas gas[i];totalCost cost[i];currentGas gas[i] - cost[i];if (currentGas 0) {startIndex i 1;currentGas 0;}}return totalGas totalCost ? startIndex : -1;
};讲解 这段代码实现了一个函数 canCompleteCircuit用于判断在一个环形路线上是否可以从某个加油站出发顺利完成一圈而不耗尽汽油。 输入参数 gas: 一个数组表示每个加油站的汽油量。cost: 一个数组表示从一个加油站到下一个加油站所需的汽油量。 变量初始化 n: 加油站的数量。totalGas: 用于累加所有加油站的汽油量。totalCost: 用于累加所有加油站的消耗量。currentGas: 用于跟踪当前剩余的汽油量。startIndex: 记录可行的起始加油站索引。 遍历加油站 使用 for 循环遍历每个加油站。在每次迭代中更新 totalGas 和 totalCost并计算 currentGas当前剩余汽油量。 判断当前汽油量 如果 currentGas 小于 0说明从当前 startIndex 到第 i 个加油站无法完成更新 startIndex 为 i 1并重置 currentGas。 返回结果 在循环结束后检查 totalGas 是否大于或等于 totalCost。如果是返回 startIndex否则返回 -1表示无法完成一圈。 思路五
var canCompleteCircuit function (gas, cost) {
const n gas.length;const dp new Array(n).fill(0);for (let i 0; i n; i) {dp[i] gas[i] - cost[i];}let totalGas 0;let totalCost 0;let currentGas 0;let startIndex 0;for (let i 0; i n; i) {totalGas gas[i];totalCost cost[i];currentGas dp[i];if (currentGas 0) {startIndex i 1;currentGas 0;}}return totalGas totalCost ? startIndex : -1;
};讲解 这段代码通过使用一个额外的数组 dp 来存储每个加油站的净汽油量并通过一次遍历时间复杂度 O(n)有效地判断是否存在一个起点使得从该起点出发能够完成一圈。这种方法同样比暴力法更高效适用于大规模数据处理。 输入参数 gas: 一个数组表示每个加油站的汽油量。cost: 一个数组表示从一个加油站到下一个加油站所需的汽油量。 变量初始化 n: 加油站的数量。dp: 一个数组用于存储每个加油站的净汽油量gas[i] - cost[i]。totalGas: 用于累加所有加油站的汽油量。totalCost: 用于累加所有加油站的消耗量。currentGas: 用于跟踪当前剩余的汽油量。startIndex: 记录可行的起始加油站索引。 计算净汽油量 使用 for 循环遍历每个加油站将 dp[i] 设置为 gas[i] - cost[i]表示从第 i 个加油站出发的净汽油量。 遍历加油站 再次使用 for 循环遍历每个加油站。在每次迭代中更新 totalGas 和 totalCost并计算 currentGas当前剩余汽油量。 判断当前汽油量 如果 currentGas 小于 0说明从当前 startIndex 到第 i 个加油站无法完成更新 startIndex 为 i 1并重置 currentGas。 返回结果 在循环结束后检查 totalGas 是否大于或等于 totalCost。如果是返回 startIndex否则返回 -1表示无法完成一圈。