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;
    }
};
相关推荐
TracyCoder123几秒前
LeetCode Hot100(11/100)——56. 合并区间
算法·leetcode
Hx_Ma169 分钟前
Leecode题知识点(25,61,82)
算法·leetcode·链表
季明洵35 分钟前
备考蓝桥杯第四天
java·数据结构·算法·leetcode·链表·哈希算法
期末考复习中,蓝桥杯都没时间学了1 小时前
力扣刷题9
算法·leetcode·职场和发展
零基础的修炼2 小时前
位运算---LC268丢失的数字
算法·leetcode·职场和发展
月挽清风2 小时前
代码随想录第十一天
c++·算法·leetcode
多米Domi0112 小时前
0x3f 第43天 黑马点评全量复习一遍 + 栈两题
开发语言·数据结构·python·算法·leetcode
xhbaitxl3 小时前
算法学习day27-贪心算法
学习·算法·贪心算法
sin_hielo3 小时前
leetcode 1200
数据结构·算法·leetcode
睡不醒的kun4 小时前
不定长滑动窗口-基础篇(2)
数据结构·c++·算法·leetcode·哈希算法·散列表·滑动窗口