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;
    }
};
相关推荐
mvufi21 分钟前
day31 第八章 贪心算法 part05
算法·贪心算法
玖剹1 小时前
矩阵区域和 --- 前缀和
数据结构·c++·算法·leetcode·矩阵·动态规划·1024程序员节
freyazzr2 小时前
Leetcode刷题 | Day50_图论02_岛屿问题01_dfs两种方法+bfs一种方法
数据结构·c++·算法·leetcode·深度优先·图论·广度优先
明月看潮生2 小时前
青少年编程与数学 02-018 C++数据结构与算法 16课题、贪心算法
c++·算法·青少年编程·贪心算法·编程与数学
且听风吟ayan3 小时前
leetcode day37 474
leetcode·c#
阳洞洞3 小时前
leetcode 2516. 每种字符至少取 K 个
算法·leetcode·滑动窗口
元亓亓亓6 小时前
LeetCode热题100--53.最大子数组和--中等
数据结构·算法·leetcode
ricky_fan8 小时前
LeetCode:55.跳跃游戏——局部最优并非全局最优!
算法·leetcode·游戏
opple6610 小时前
力扣-数据结构-二叉树
数据结构·算法·leetcode
yunson_Liu11 小时前
prometheus通过Endpoints自定义grafana的dashboard模块
贪心算法·grafana·prometheus