力扣134:加油站 ✔

博客围绕LeetCode算法题展开,介绍两种C++解法。一是遍历结点个数确定,判断当前结点能到达的最远值,若经过结点数等于n则可遍历一周;二是根据剩余油量判断,若总油量大于等于总耗油量,即油剩余量大于等于0就能跑完一圈,总耗油量小于0则返回 -1。

目录

1. 解题思路

2. CODE

1. 解法一:遍历结点个数确定

2. 解法二:剩余油量进行判断


1. 解题思路

        参考答案解题思路:

    解决此题需要知道:从 x 出发 经过 z加油站最远到达 y 加油站,则从 z加油站出发一定不能到 y+1 的加油站:因为 从x 出发到 z ,其汽车中的余量一定 >= 0 的;若从 x 到 z 还有余量才到达 y 所以其一定不能到达 y+1 处。这就更别提 从 x 到 z 还有余量为 0 啦。

    所以我们此时有两种解法:

    1.只需要判断当前结点所能到达的最远值,若最后到达的最远值的位置与 其 起始地址一样,则返回答案,否则就判断该结点能到达的最远位置的下一个结点即可。即可判断从某节点遍历经过的结点个数即可,若中间经过的结点个数==n,则说明可以遍历一周,否则更换起始点位置。

    2.只要总油量大于等于总耗油量就肯定能跑完一圈,换句话说,油的剩余量如果大于等于0就肯定能跑完一圈,这么一想这个问题就简单了,那么总耗油量如果小于0,直接返回-1

2. CODE

1. 解法一:遍历结点个数确定

        int n=gas.size();
        int curnum=0; //当前剩余量
        int totalnum=0; // 总的剩余量耗油量
        int idx=0;
        for(int i=0;i<n;i++){
            curnum+=gas[i]-cost[i];//用于存储 从 起始点 开始的到达 i 时剩余油量,若小于 0 则更换起始站
            totalnum+=gas[i]-cost[i];
            if(curnum<0){//说明当前到达不了此站,需要重新选定起始站
            idx=(i+1)%n;
            curnum=0;
            }
        }
        if(totalnum<0) return -1;
        return idx;

2. 解法二:剩余油量进行判断


        int cnt=0;//存储中间经过的结点个数
        for(int i=0;i<n;i++){
            
            cnt=0;
           int sumgas=0;
           int sumcost=0;
            while(cnt<n)//判断从i开始其查找的结点个数,若是最后cnt==n,说明其可以循环一周
            {
                j=(i+cnt)%n;// 以j为起始结点,然后遍历一周,其所有的gas是否大于或等于 cost,最后
                sumgas+=gas[j];
                sumcost+=cost[j];
                if (sumcost>sumgas) {
                    break;
                }
                cnt++;
            }
            if(cnt==n)
            return i;
            i=i+cnt;
        }
        return -1;

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值