Leetcode134 加油站 - 贪心!

题目链接

发布于Leetcode的题解

解题思路——贪心

  1. 首先我们会考虑依次从每个点开始遍历,如果能成功跑一圈那么该起点就可以作为答案输出( O ( n 2 ) O(n^{2}) O(n2))。最终不出意外TLE。

  2. 继续按照这个思路,看看哪些步骤是多余的——和暴力方法入手点相同,我们从 i=0 的点开始跑(初始化 curGas=0, sumGas=0, sumCost=0, ans=0):

    • 第一种情况:假如能成功跑完,那皆大欢喜直接 return 0;
    • 第二种情况:不能成功跑完,假设跑到了 j 点时跑不动了(即无法从 j 跑到 j+1 点)——这意味着想从 0 开始跑完全程是不可能的,会卡在 j 。然后根据这个条件,我们考虑从 0 到 j+1 的路程中的 j 个点,相比于直接从这些点出发,从 0 出发能得到 >=0 的油(因为currentGas不为负才能到下一个点)。也就是说,从 0 出发都到不了 j+1 ,那么从 1~j 中任意一点出发都到不了 j+1 !
  3. 于是延续第二种情况中得出的结论,从 0~j 中任意一点出发都是无法跑完全程的(边界条件 j=len-1 时即循环的最后一次时跑不回起点),那么如果答案存在,就一定在 j+1~len-1 中。

  4. 于是令 ans=j+1, curGas=0,继续从 j+1 开始枚举。

  5. 如此一直循环到 i=len-1,此时会面临两种情况:

    • 跑完 curGas>=0 ,成功!之前记录的 ans 可能就是最终答案;
    • 跑完 curGas<0 ,遗憾离场。记录 ans=i+1=len,curGas=0。
  6. 但是需要不需要担心把 ans=len 这个答案给输出出来了呢?——不用担心,因为最后还需要作最终检验:sumGas>=sumCost? 因为只要该不等式成立,那么一定存在满足跑完一圈的点,反之一定不存在!

为什么还需要检验 sumGas>=sumCost? 呢?不是在遍历的时候已经得出 ans 了吗?

——因为在 j+1 之后,我们只考虑了能不能跑完 j+1~len-1 这部分,而没有管在 len-1 之后还能不能跑完 0~j 这部分。如果满足 sumGas>=sumCost? 那么这个 ans 一定能跑完全程了,而这正是结合:排除法+一定存在解的结论得出的解了!(还要加上题干给出如果有解那一定是唯一解的条件)

复杂度

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

Code

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int curGas=0,sumGas=0,sumCost=0,ans=0;
        for(int i=0;i<gas.size();++i){
            sumGas+=gas[i];sumCost+=cost[i];
            curGas+=gas[i]-cost[i];
            if(curGas<0){
                ans=i+1;
                curGas=0;
            }
        }
        return sumGas>=sumCost?ans:-1;
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值