写点什么

贪心算法:加油站 ⛽

作者:空城机
  • 2021 年 11 月 24 日
  • 本文字数:1102 字

    阅读完需:约 4 分钟

贪心算法:加油站 ⛽

隔了一段时间后,来重新训练贪心算法,看看自己的速度是否提升,结果还是不错,leetcode上同样难度的贪心算法解题思路和速度都比之前快了些。

加油站

题目地址: https://leetcode-cn.com/problems/gas-station/


题目描述:


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


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


如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -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 可为起始索引。
复制代码


题目分析


本题我在看来,第一印象与当初做过的一道《两地调度》问题很像,都是贪心算法


在加油站油量和消耗两个数组比较时可以进行相减,得到一个新的数组,想到于在此加油站时油箱到底是负还是正


当然,即使此时的新数组重新累加,如果总和小于 0,即为无法走完一圈,可以返回-1。

不过这样还有一个问题,那就是可以走完,如何得到起始点的位置。


这里我在数组遍历循环时,设置一个总数 total,total 从第一个值开始累加,如果出现 total 为负,记录下此时的 total 到 lastTotal 中和将 index 记录到 firstZ,将 total 重新置为 0,然后继续走,再次为负,lastTotal 累加,调整 firstZ 为最新的 index。


当数组遍历完毕后,将最后的 total 和 lastTotal 相加,就是数组的总和。总和大于等于 0,并且 lastTotal 为 0,那么说明从第一个值就可以走完。否则起始点位置就是 firstZ + 1.


var canCompleteCircuit = function(gas, cost) {    let firstZ = 0, lastTotal = 0, total = 0;    gas.forEach((item,index)=>{        let n = item - cost[index];        total += n;        // 记录total和index        if (total < 0) {            lastTotal += total;            total = 0;            firstZ = index;        }    })    // lastTotal + total为总和    if ((lastTotal + total) < 0) {        return -1;    } else {        if (lastTotal == 0) { return 0; }        return firstZ + 1;    }};
复制代码


发布于: 14 小时前阅读数: 5
用户头像

空城机

关注

曾经沧海难为水,只是当时已惘然 2021.03.22 加入

业余作者,在线水文 主要干前端的活,业余会学学python 欢迎各位关注,互相学习,互相进步

评论

发布
暂无评论
贪心算法:加油站 ⛽