[Java][Leetcode middle] 134. 加油站

方法一,自己想的,超时

双重循环

从第一个点开始循环尝试,

如果最终能走到终点,说明可行。

java 复制代码
public int canCompleteCircuit(int[] gas, int[] cost) {
        int res = -1;
        int n = gas.length;

        int remainGas;
        int j;
        for (int i = 0; i < n; i++) {
            remainGas = 0;
            for (j = i; j < n + i; j++) {
                int tmp = j;
                if (tmp >= n) {
                    tmp = tmp - n;
                }
                remainGas += gas[tmp] - cost[tmp];
                if (remainGas < 0) {
                    break;
                }
            }
            if (j == n + i) {
                res = i;
                break;
            }
        }
        return res;
    }

方法二,官方题解

利用结论:

假设x到不了y+1,那么[x,y]中的任意一个节点都无法到达y+1。那么循环直接从y+1开始即可

改造我们的代码

java 复制代码
public int canCompleteCircuit(int[] gas, int[] cost) {
        int res = -1;
        int n = gas.length;

        int remainGas;
        int cnt = 0;
        int tmp = 0;
        for (int i = 0; i < n; i++) {
            remainGas = 0;
            for (cnt = 0; cnt < n; cnt++) {
                tmp = (i + cnt)%n;
                remainGas += gas[tmp] - cost[tmp];
                if (remainGas < 0) {
                    break;
                }
            }
            if (cnt == n) {
                res = i;
                break;
            }else {
                i = i + cnt;
            }
        }
        return res;
    }

评论区做法

利用唯一解的特性;

使用一次遍历,如果存在解,那么解一定出现在最耗油的一段路之后。

java 复制代码
    public int canCompleteCircuit3(int[] gas, int[] cost) {
        int res = -1;
        int n = gas.length;

        int remainGas = 0;
        int minRemain = Integer.MAX_VALUE;
        int use = 0;
        for (int i = 0; i < n; i++) {
            use = gas[i] - cost[i];
            remainGas += use;
            if (remainGas <  minRemain) {
                minRemain = remainGas;
                res = i;
            }
        }

        if(remainGas >= 0){
            return (res + 1)%n;
        }else {
            return -1;
        }
    }
相关推荐
云原生指北1 小时前
GitHub Copilot SDK 入门:五分钟构建你的第一个 AI Agent
java
Leinwin5 小时前
OpenClaw 多 Agent 协作框架的并发限制与企业化规避方案痛点直击
java·运维·数据库
薛定谔的悦5 小时前
MQTT通信协议业务层实现的完整开发流程
java·后端·mqtt·struts
enjoy嚣士6 小时前
springboot之Exel工具类
java·spring boot·后端·easyexcel·excel工具类
罗超驿6 小时前
独立实现双向链表_LinkedList
java·数据结构·链表·linkedlist
盐水冰7 小时前
【烘焙坊项目】后端搭建(12) - 订单状态定时处理,来单提醒和顾客催单
java·后端·学习
凸头7 小时前
CompletableFuture 与 Future 对比与实战示例
java·开发语言
wuqingshun3141597 小时前
线程安全需要保证几个基本特征
java·开发语言·jvm
努力也学不会java8 小时前
【缓存算法】一篇文章带你彻底搞懂面试高频题LRU/LFU
java·数据结构·人工智能·算法·缓存·面试
攒了一袋星辰8 小时前
高并发强一致性顺序号生成系统 -- SequenceGenerator
java·数据库·mysql