134. 加油站(贪心算法)

根据题解

这道题使用贪心算法,找到当前可解决问题的状态即可

「贪心算法」的问题需要满足的条件:

  1. 最优子结构:规模较大的问题的解由规模较小的子问题的解组成,规模较大的问题的解只由其中一个规模较小的子问题的解决定;
  2. 无后效性:后面阶段的求解不会修改前面阶段已经计算好的结果;
  3. 贪心选择性质:从局部最优解可以得到全局最优解。

如果要求走一圈,则总剩余油量total应该大于等于0

而在每个站点的时候,当前剩余油量curr如果大于等于0,代表可以到达下一个站点,如果小于0,代表从当前及之前的站点出发无法到达下一个站点,于是出发点改为下一个站点。

为什么说当前及之前的站点出发都无法到达下一个站点呢?

参考这个题解的图:

可以看到,假设start已经更改为3之后,可以到达4,假设到下一个节点时,cursum变成了负数,而在这之前的两个站点的cursum都是正数,代表它俩的加和都不够,更别提其中一个了 ,所以start会跳过4,更新为i+1

cpp 复制代码
class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int n = gas.size();
        int start = 0;
        int curr = 0;
        int total = 0;
        for (int i = 0; i < n; ++i) {
            curr += gas[i] - cost[i];
            total += gas[i] - cost[i];
            if (curr < 0) {
                start = i + 1;
                curr = 0;
            }
        }
        return total >= 0 ? start : -1;
    }
};
相关推荐
小此方2 分钟前
Re:从零开始的链式二叉树:建树、遍历、计数、查找、判全、销毁全链路实现与底层剖析
c语言·数据结构·c++·算法
im_AMBER6 分钟前
Leetcode 65 固定长度窗口 | 中心辐射型固定窗口
笔记·学习·算法·leetcode
得物技术13 分钟前
项目性能优化实践:深入FMP算法原理探索|得物技术
前端·算法
FMRbpm14 分钟前
STL中栈的实现
数据结构·c++·算法
roman_日积跬步-终至千里16 分钟前
【模式识别与机器学习(3)】主要算法与技术(中篇:概率统计与回归方法)之贝叶斯方法(Bayesian)
算法·机器学习·回归
AI科技星19 分钟前
加速正电荷产生的电场、引力场与磁场变化率方向关系的数学求导验证——基于张祥前统一场论核心方程
数据结构·人工智能·经验分享·算法·机器学习·计算机视觉
zore_c43 分钟前
【C语言】文件操作详解1(文件的打开与关闭)
c语言·开发语言·数据结构·c++·经验分享·笔记·算法
资深web全栈开发44 分钟前
[特殊字符] LeetCode 2141:如何让 N 台电脑续航最久?——“二分答案“套路一文讲透
算法·leetcode
刃神太酷啦1 小时前
C++的IO流和C++的类型转换----《Hello C++ Wrold!》(29)--(C/C++)
java·c语言·开发语言·c++·qt·算法·leetcode
稚辉君.MCA_P8_Java1 小时前
Gemini永久会员 哈希表(Hash Table)高效的数据结构
java·数据结构·后端·算法·架构