力扣面试150题 加油站

文章描述了一个关于路径规划的问题,给定汽油量和消耗量,判断是否存在一个起点,可以从这个加油站开始,按照环路顺序行驶一周,且最终油箱内至少有剩余汽油。解决方案是通过线性枚举起点并动态计算剩余汽油量,找到满足条件的唯一起始站。
摘要由CSDN通过智能技术生成

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

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

给定两个整数数组 gas 和 cost ,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。

解法: 线性的枚举每个点,如果当前点能到达下一个点,则先以当前点为起点,看看能不能遍历完n个点后,油量仍然大于等于0,如果有,说明当前起点可以作为答案。否则,起点移动至 不能到达的那个点,因为,假设x点能到达y点,到达不了y+1点,则x到y中的任意一点都到不了y+1个点,故可以排除一些点。如果选中的点本身就不能到达下一个点,我们就继续找下一个点,能满足到达下一个点的点。

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int start =0;

        int n =gas.size();

        while(start<n)
        {
            if(gas[start]>=cost[start])
            {
                int current_gas=gas[start]-cost[start];
                for(int j=1;j<n;j++)
                {
                    current_gas += gas[(start+j)%n]-cost[(start+j)%n];
                    if(current_gas<0)
                    {   //注意这里不能模运算,就线性遍历过去,模运算会导致运算错误超时
                        start=start+j+1;
                        break;
                    }
                }
                if(current_gas>=0)return start;
            }

            else 
                start++;
        }
        return -1;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值