Leetcode经典题11--加油站

题目描述

在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。

你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。

给定两个整数数组 gas 和 cost ,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。

输入输出示例:

输入: gas = [1,2,3,4,5], cost = [3,4,5,1,2]

输出: 3

解释:从 3 号加油站(索引为 3 处)出发,可获得 4 升汽油。此时油箱有 = 0 + 4 = 4 升汽油

开往 4 号加油站,此时油箱有 4 - 1 + 5 = 8 升汽油开往 0 号加油站,此时油箱有 8 - 2 + 1 = 7 升汽油

开往 1 号加油站,此时油箱有 7 - 3 + 2 = 6 升汽油开往 2 号加油站,此时油箱有 6 - 4 + 3 = 5 升汽油

开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。因此,3 可为起始索引。

解决方案

方式一:贪心

假设我们此前发现,从加油站 x 出发,每经过一个加油站就加一次油(包括起始加油站),最后一个可以到达的加油站是 y(不妨设 x<y)

第一个式子表明从x加油站出发无法到达加油站 y 的下一个加油站,

第二个式子表明可以到达 y 以及 y 之前的所有加油站。

现在,考虑任意一个位于 x,y 之间的加油站 z(包括 x 和 y),我们现在考察从该加油站出发,能否到达加油站 y 的下一个加油站

结论为,如果从 加油站 x 出发无法到达 加油站 y ,则 x 和 y 之间的加油站也无法到达加油站 y

实现代码

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int n = gas.length;//加油站的数量
        int i = 0;
        while (i < n) {//外层索引,判断从第i个站点作为起点,能否绕圈完成行程
        //sumOfGas总的加油量 sumOfCost 总的耗油量
            int sumOfGas = 0, sumOfCost = 0;
            int cnt = 0;   //经过的站点数量
            while (cnt < n) {
                int j = (i + cnt) % n;  //对应的加油站的索引
                sumOfGas += gas[j];
                sumOfCost += cost[j];
                if (sumOfCost > sumOfGas) {
                    break;//如果耗油量大于加油量,则不能实现绕圈
                }
                cnt++;
            }
            if (cnt == n) {
                return i;  //如果能绕圈的话,返回下标
            } else {
                i = i + cnt + 1;//根据结论,第i个加油站,无法到达第cnt个加油站,那么之间的加油站也是无法到达i+cnt个加油站的,所以直接从第i+cnt+1个加油占出发
            }
        }
        return -1;
    }
}

复杂度分析

时间复杂度:O(N),

其中 N 为数组的长度。我们对数组进行了单次遍历。

空间复杂度:O(1)。

方式二: 计算剩余油量

算法思想:统计经过i个站点的剩余的油量,并且记录剩余油量最小的站点,如果剩余油量

实现代码

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int len = gas.length;
        int spare = 0;//遍历站点累积剩余的汽油量。
        int minSpare = Integer.MAX_VALUE;//遍历站点之后的最小剩余汽油量
        int minIndex = 0;//出现最小剩余汽油量时,对应的站点

        for (int i = 0; i < len; i++) {
            spare += gas[i] - cost[i];// 剩余的油量
            if (spare < minSpare) {
                minSpare = spare; // 最小的剩余油量
                minIndex = i;
            }
        }

        return spare < 0 ? -1 : (minIndex + 1) % len;
    }
}

spare < 0 ? -1 : (minIndex + 1) % len;

spare < 0:如果经过完整一轮遍历后,总的剩余汽油量 spare 是小于 0 的,这意味着在整个环形路线中,无论从哪个站点出发,按照给定的各站点汽油量和消耗情况,最终汽油都是不够用的,没办法绕一圈回到起点,所以此时返回 -1,表示不存在这样能完成环形路线的起始站点。

而如果 spare >= 0,说明整体上汽油量是足够绕一圈的。此时需要返回合适的起始站点索引,这里返回 (minIndex + 1) % len。之所以是 minIndex + 1,是因为我们记录的 minIndex 是出现最小剩余汽油量的那个站点索引

而从逻辑上分析,想要顺利绕圈,应该从这个最小剩余汽油量站点的下一个站点出发(因为在这个最小剩余站点处汽油量是最少的,往前汽油更少,所以往后一个站点出发更有可能绕圈成功),同时使用取余操作 % len 是因为这是环形路线,当 minIndex + 1 的值超过了站点数量 len 时,通过取余可以将索引正确地映射回环形路线中的有效站点索引范围,确保返回的是一个合法的可以作为起始站点的索引值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/937587.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端退出对话框也就是点击右上角的叉,显示灰色界面,已经解决

文章目录 遇到一个前端bug&#xff0c;点击生成邀请码 打开对话框 然后我再点击叉号&#xff0c;退出对话框&#xff0c;虽然退出了对话框&#xff0c;但是显示灰色界面。如下图&#xff1a; 导致界面就会失效&#xff0c;点击任何地方都没有反应。 发现是如下代码的问题&am…

软件需求概述(尊享版)

软件需求与软件分析 软件需求&#xff1a;用户角度&#xff0c;注重软件外在表现 软件分析&#xff1a;开发者角度&#xff0c;注重软件内部逻辑结构 面向对象分析模型 类/对象模型&#xff08;全部的类和对象&#xff09; 对象-关系模型&#xff08;对象之间的静态关系&…

配置Hugging_face国内镜像

目录 随着人工智能技术的蓬勃发展&#xff0c;Huggingface这一开源平台已成为研究者和开发者的宝贵资源&#xff0c;提供了丰富的预训练模型&#xff0c;助力自然语言处理任务的快速推进。然而&#xff0c;对于身处国内的我们而言&#xff0c;访问Huggingface主仓库时&#xff…

Rust之抽空学习系列(四)—— 编程通用概念(下)

Rust之抽空学习系列&#xff08;四&#xff09;—— 编程通用概念&#xff08;下&#xff09; 1、函数 函数用来对功能逻辑进行封装&#xff0c;能够增强复用、提高代码的可读 以下是函数的主要组成部分&#xff1a; 名称参数返回类型函数体 1.1、函数名称 在Rust中&…

电脑游戏运行时常见问题解析:穿越火线提示“unityplayer.dll丢失”的修复指南

电脑游戏运行时常见问题解析&#xff1a;穿越火线提示“unityplayer.dll丢失”的修复指南 在探索电脑游戏的无限乐趣时&#xff0c;我们时常会遇到一些不期而遇的挑战。今天&#xff0c;我们将聚焦于一个常见的游戏运行错误——穿越火线&#xff08;或其他使用Unity引擎的游戏…

Mac系统下 jdk和maven 安装教程

一、jdk安装教程 1、先去官网选择对应版本下载 官网网址&#xff1a;Java SE | Oracle Technology Network | Oracle 中国 这里我选择的是jdk8的版本&#xff0c;如果你们想下载更高的版本就选择其他版本&#xff0c;目前大部分公司和教程使用jdk8的版本比较多。 点击macos&a…

Python -- Linux中的Matplotlib图中无法显示中文 (中文为方框)

目的 用matplotlib生成的图中文无法正常显示 方法 主要原因: 没找到字体 进入windows系统的C:\Windows\Fonts目录, 复制自己想要的字体 粘贴到Linux服务器中对应python文件所处的文件夹内 设置字体: 设置好字体文件的路径在需要对字体设置的地方设置字体 效果 中文正常显…

Python中的self关键字详解

文章目录 Python中的self关键字详解一、引言二、self的基本概念1、定义类和实例 三、self在方法调用中的角色2、调用其他方法 四、使用示例3、继承中的self 五、总结 Python中的self关键字详解 一、引言 在Python的面向对象编程中&#xff0c;self是一个至关重要的概念&#x…

LabVIEW热电偶传感器虚拟仿真实验系统

在教学和科研领域&#xff0c;实验设备的更新和维护成本较高&#xff0c;尤其是在经济欠发达地区&#xff0c;设备的短缺和陈旧化严重影响了教学质量。基于LabVIEW的热电偶传感器虚拟仿真实验系统能够通过模拟实验环境&#xff0c;提供一个成本低廉且效果良好的教学和研究平台。…

优选算法《双指针》

在学习了C/C的基础知识之后接下来我们就可以来系统的学习相关的算法了&#xff0c;这在之后的笔试、面试或竞赛都是必须要掌握的&#xff1b;在这些算法中我们先来了解的是一些非常经典且较为常用的算法&#xff0c;在此也就是优选出来的算法&#xff0c;接下来在每一篇章中我们…

分布式数据库 OceanBase 的前世今生

文章目录 分布式数据库的开端OceanBase 2022 年度发布会为什么“小就是大”&#xff1f;商业化进程按下“加速键”向国际输出中国技术 OceanBase 2024 年度发布会为什么要做云数据库&#xff1f;2 年服务超 700 客户崭露头角一体化云数据库简化数据栈产品力和生态力是未来制胜关…

ubuntu 磁盘空间满,找不到占用文件的目录

解决方法&#xff1a; 检查磁盘空间&#xff1a; 执行 df -h 查看各分区磁盘使用情况。 查找大文件或目录&#xff1a; 执行 du -sh /* 2>/dev/null 查找根目录下的大文件或目录&#xff0c;再逐一进入子目录使用相同命令查找。 清理缓存和临时文件&#xff1a; 清理 /t…

图的基本概念|存储

图的基本概念 图的定义 图G由顶点集V和边集E组成&#xff0c;记为G&#xff08;V&#xff0c;E) 其中V(G)表示图G中顶点的有限非空集&#xff1b;E&#xff08;G)表示图G中顶点之间的关系&#xff08;边&#xff09;集合。 若V{ v 1 , v 2 , … , v n v_{1},v_{2},\dots,v_{n…

【Go】Linux、Windows、Mac 搭建Go开发环境

1、Linux 第一步&#xff0c;在 官网 下包&#xff0c;如 go1.23.4.linux-386.tar.gz&#xff08;注意架构区分&#xff09; 第二步&#xff0c;将包上传至服务器&#xff0c;假如上传到 tmp目录下第三步&#xff0c;安装# 解压 tar -C /app -xzvf go1.23.4.linux-386.tar.gz#…

tryhackme-Pre Security-Defensive Security Intro(防御安全简介)

任务一&#xff1a;Introduction to Defensive Security防御安全简介 此room的两个要点&#xff1a; Preventing intrusions from occurring 防止入侵发生Detecting intrusions when they occur and responding properly 检测发生的入侵并正确响应 防御安全还有更多内容。 除上…

linux网络编程 | c | 多进程并发服务器实现

多进程并发服务器 基于该视频完成 11-多进程并发服务器思路分析_哔哩哔哩_bilibili 通过的是非阻塞忙轮询的方式实现的 和阻塞等待的区别就是&#xff0c;阻塞是真的阻塞了&#xff0c;而这个方式是一直在问有没有请求有没有请求 文章目录 多进程并发服务器1.核心思路&…

Jlink调试找出程序隐藏BUG

有时候某些设备会在特定的情况卡死&#xff0c;而我们又不容易复现&#xff0c;这时候就需要使用JLink查看卡死设备PC寄存器的值&#xff0c;来定位程序卡死位置 1、第一步 连接好卡死设备&#xff0c;千万不要断电 2、打开JLink Commander 根据芯片型号和连接方式输入连接…

【小白包会的】使用supervisor 管理docker内多进程

使用supervisor 管理docker内多进程 一般情况下&#xff0c;一个docker是仅仅运行一个服务的 但是有的情况中&#xff0c;希望一个docker中运行多个进程&#xff0c;运行多个服务&#xff0c;也就是一个docker容器执行多个服务。 调研了一下&#xff0c;发现可以通过**super…

关系识别分类任务的评估指标: precision、recall、f1-score. 理解混淆矩阵

理解TP/FP/FN TP: 真实关系为A&#xff0c;预测关系也为A。FP: 预测为关系A&#xff0c;但真实关系不为AFN: 真实关系为A&#xff0c;但预测关系为其他关系。 代码 import matplotlib matplotlib.use(Agg) import matplotlib.pyplot as plt from sklearn.metrics import conf…

若依实现图片上传时自动添加水印

文章目录 总体思路1. 修改通用上传方法2. 去除文件路径前两级目录3. 添加水印方法运行效果总结 为了解决图盗用&#xff0c;并有效保护图片版权&#xff0c;若依项目需要实现一个功能&#xff1a;上传图片时&#xff0c;自动在图片上添加水印。这不仅可以有效防止盗用&#xff…