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

c++ 复制代码
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;
    }
};
相关推荐
im_AMBER3 分钟前
Leetcode 68 搜索插入位置 | 寻找比目标字母大的最小字母
数据结构·笔记·学习·算法·leetcode
CoderYanger7 分钟前
动态规划算法-斐波那契数列模型:1.第N个泰波那契数
开发语言·算法·leetcode·动态规划·1024程序员节
狐5711 分钟前
2025-12-03-LeetCode刷题笔记-3625-统计梯形的数目-II
笔记·leetcode
博语小屋3 小时前
力扣 15.三数之和(medium)(双指针)
算法·leetcode·职场和发展
无敌最俊朗@3 小时前
双指针-力扣hot100-移动零.283
算法·leetcode·职场和发展
练习时长一年3 小时前
LeetCode热题100(腐烂的橘子)
算法·leetcode·职场和发展
java修仙传10 小时前
每日一题,力扣560. 和为 K 的子数组
算法·leetcode
ada7_10 小时前
LeetCode(python)——148.排序链表
python·算法·leetcode·链表
资深web全栈开发12 小时前
LeetCode 3625. 统计梯形的数目 II
算法·leetcode·组合数学
橘颂TA12 小时前
【剑斩OFFER】算法的暴力美学——外观数列
算法·leetcode·职场和发展·结构与算法