Leetcode134加油站

题目链接

134

题意图解:

  • 题目给了n个节点,这些节点呈现环状,每次到一个低点要消耗costi的油量。

    从中我们可以得出一个结论:看一个点能不能到下一个点,就要用当前的油量减去消耗的量,那么gasi - costi,就表明这个点到了下一个点之后剩余的油量,如果是负数,说明它走不到下一个点,会在半路熄火。

  • 那么它的累加和的意义就是从累加起点到累加终点剩余的油量,如果为负数,那么说明我们当前选取的起点无法到达目前的终点,为正数好理解,还有余量,只要大于等于0,都是可以的。

  • 然后我们继续往下思考:

  1. 题目场景是个环,给的数据结构是数组,是线性的,怎么模拟实现一个环?多重循环会超时且麻烦,回想能循环的,能用数组模拟的结构,便是循环队列,在循环队列中,我们就是采用下标对数组长度取模来实现一个循环的数组的,这样就可以模拟环结构了。
  2. 我们发现当前起点选取不合理,该怎么调整呢?

我们来看左程云举得例子,如果起点l 到 终点r时为负数,那么说明在r - 1的时候余量还是大于等于0的,也就是说我们从l 到r - 1获取的油量刚好是大于等于0的,如果我们不从 l 开始呢?这意味着我们会少加一些余量,那我们想想,之前余量没少加的时候都到达不了l,现在余量少加了,还能到吗?显然不能,所以此时我们要让左边界来到r + 1的位置重新进行滑动窗口右边界的扩展。

代码

java 复制代码
class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int n = gas.length;
        for (int r = 0, l = 0, sum; l < n; l = r + 1, r = l) { 
            sum = 0;
            while (sum + gas[r % n] - cost[r % n] >= 0) { 
                if (r - l + 1 == n) { 
                    return l;
                }
                sum += gas[r % n] - cost[r % n];
                r ++;
            }
        }
        return -1;
    }
}
相关推荐
2601_954526753 小时前
【工业传感与算法实战】温漂补偿与零点抗漂破局:基于二阶多项式拟合的 C/C++ 边缘校准算法,深度拆解“压力变送器什么牌子好”的技术硬指标
c语言·c++·算法
叩码以求索4 小时前
浅谈:算法萌新如何高效刷题应对面试(一)
算法·面试·职场和发展
谙弆悕博士5 小时前
信息系统项目管理师教程(第4版)笔记——第 2 章 信息技术发展
笔记·职场和发展·软考高级·软考·高项·项目经理
c238565 小时前
把 C++ 内存分配拆透:new 与 malloc 的三层血缘
开发语言·c++·算法
wp123_16 小时前
【硬件选型笔记】TONEVEE MVL4020-1R2M 与Coilcraft XAL4020-122MEC 大电流功率电感参数深度解析
笔记
aaaameliaaa6 小时前
指针之总结
c语言·笔记·算法
宵时待雨7 小时前
优选算法专题9:哈希表
数据结构·算法·散列表
txzrxz7 小时前
最短路问题——Dijkstra 算法
数据结构·c++·算法·最短路·优先队列
gwf2167 小时前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件
撩得Android一次心动7 小时前
Linux编程笔记3【个人用】
linux·笔记