134.力扣刷题--加油站--滑动窗口

你知道的,失败总是贯穿人生的始终。

加油站

在一条环路上有 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 可为起始索引。

思路分析

这题其实就像是一个“环球旅行”的游戏。想象你有一辆油箱可以无限装油的车,你要开着这辆车从某个加油站出发,沿着一条环形的路线旅行一圈再回到出发的那个加油站。每个加油站都有一定数量的汽油可以加到你的车里,而从一个加油站到下一个加油站的路途中,你的车会消耗一定的汽油。

具体来说,题目提供了两个数组:

  • gas 数组:表示每个加油站能给你的车加多少升的油。例如 gas[i] 表示在第 i 个加油站可以加 gas[i] 升油。

  • cost 数组:表示从一个加油站开到下一个加油站需要消耗多少升的油。例如 cost[i] 表示从第 i 个加油站开到第 i+1 个加油站需要消耗 cost[i] 升油。由于这是一个环形路线,所以从最后一个加油站回到第一个加油站也会消耗一定的油。

你的任务是找出一个起点加油站的编号,从这个起点加油出发,使用上面提供的油量和消耗量,你可以成功地绕行一圈回到这个起点,而不会在中途因为油不够而停下来。如果找不到这样的起点,就返回 -1。注意,题目保证如果有解,这个解是唯一的。

如何理解余量数组?

首先拿每个gas[i]减去cost[i],得到余量数组,也就是说,加的油减去耗去的油,如果结果是小于0的,那么说明这个点是不能转一圈的。

如何理解转圈?

对于余量数组如下图而言,拿0下标举例,从0->1->2->3->4->5->0,就是转圈

  • 1->2->3->4->5->0->1 是转圈

  • 2->3->4->5->0->1->2 是转圈

  • ...依次类推

代码中是如何处理转圈的呢?

想象着把数组copy了一份,然后每一个转圈就被铺平了,比如从2号下标开始,对应的就是2-8(8%6)号下标。这样就不用两个for循环处理了,时间复杂度O(n)

如何得到结果

把每个余量数组的值加起来,如果前缀和都大于0,那么代表可以转圈。有一个小于0,就不能转圈。返回最早那个可以转圈的下标,其实所有的点都可以判断,但是本题是要求返回满足转圈条件最早的那个。

对于余量数组[3,5,-10,6,7,-4]而言

  • 从0号下标开始累加,【3+5+(-10)】<0 ,pass掉

  • 从1号下标开始,5+(-10)<0,pass

  • 从2号下标开始,-10本身小于0,pass

  • 从3号下标开始,6+7=13,13-4=9,9+3=12,12+5=17,17-10=7,7+6=13,我们可以发现,每一个加法得出的结果都是大于等于0的,返回3

如何优化

有两个点

第一点,在处理转圈的时候,我们把环转为一个直线处理

第二点,在挨个判断余量数组的时候可以跳跃。

对于余量数组[3,5,-10,6,7,-4]而言,原来得挨个判断

  • 从0号下标开始累加,【3+5+(-10)】<0 ,pass掉

  • 从1号下标开始,5+(-10)<0,pass (多余)

  • 从2号下标开始,-10本身小于0,pass

  • 从3号下标开始,6+7=13,13-4=9,9+3=12,12+5=17,17-10=7,7+6=13,我们可以发现,每一个加法得出的结果都是大于等于0的,返回3

其实在3+5=8,8+-10=-2时,1号下标是不用判断的。1号下标的判断是多余的,直接跳到2号下标开始判断。抽象化就是从l--r-1开始的累加和都大于0,但是加到r时,累加和<0,l-r-1的下标都不用判断了,l直接跳到r开始继续判断。

也就是对应以下代码,左边界有一个跳跃,l=r+1,r=l;

完整代码

// 加油站
// 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
// 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升
// 你从其中的一个加油站出发,开始时油箱为空。
// 给定两个整数数组 gas 和 cost ,如果你可以按顺序绕环路行驶一周
// 则返回出发时加油站的编号,否则返回 -1
// 如果存在解,则 保证 它是 唯一 的。
// 测试链接 : https://leetcode.cn/problems/gas-station/
public class Code04_GasStation {public static int canCompleteCircuit(int[] gas, int[] cost) {int n = gas.length;// 本来下标是0..n-1,但是扩充到0..2*n-1,i位置的余量信息在(r%n)位置// 窗口范围是[l, r),左闭右开,也就是说窗口是[l..r-1],r是到不了的位置for (int l = 0, r = 0, sum; l < n; l = r + 1, r = l) {sum = 0;while (sum + gas[r % n] - cost[r % n] >= 0) {// r位置即将右扩,窗口会变大if (r - l + 1 == n) { // 此时检查是否已经转了一圈return l;}// r位置进入窗口,累加和加上r位置的余量sum += gas[r % n] - cost[r % n];// r右扩,窗口变大了r++;}}return -1;}}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爬虫基础(二)Web网页的基本原理

一、网页的组成 网页由三部分构成&#xff1a;HTML、JavaScript、CSS。 &#xff08;1&#xff09;HTML HTML 相当于网页的骨架&#xff0c;它通过使用标签来定义网页内容的结构。 举个例子&#xff1a; 它把图片标签为img、把视频标签为video&#xff0c;然后组合到一个界面…

Three.js实现3D动态心形与粒子背景的数学与代码映射解析

一、效果概述 本文通过Three.js构建了一个具有科技感的3D场景&#xff0c;主要包含两大视觉元素&#xff1a; 动态心形模型&#xff1a;采用数学函数生成基础形状&#xff0c;通过顶点操作实现表面弧度。星空粒子背景&#xff1a;随机分布的粒子群组形成空间层次感。复合动画…

Java线程认识和Object的一些方法

专栏系列文章地址&#xff1a;https://blog.csdn.net/qq_26437925/article/details/145290162 本文目标&#xff1a; 要对Java线程有整体了解&#xff0c;深入认识到里面的一些方法和Object对象方法的区别。认识到Java对象的ObjectMonitor&#xff0c;这有助于后面的Synchron…

【蓝桥杯省赛真题02】C++猫吃鱼 第十届蓝桥杯青少年创意编程大赛 算法思维 C++编程省赛真题解

目录 C猫吃鱼 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、运行结果 五、考点分析 七、推荐资料 C猫吃鱼 第十届蓝桥杯青少年创意编程大赛C选拔赛真题 一、题目要求 明明家从1号站点出发&#xff0c;开车去旅游&#xff0c;一共要经过n个…

无公网IP 外网访问 本地部署夫人 hello-algo

hello-algo 是一个为帮助编程爱好者系统地学习数据结构和算法的开源项目。这款项目通过多种创新的方式&#xff0c;为学习者提供了一个直观、互动的学习平台。 本文将详细的介绍如何利用 Docker 在本地安装部署 hello-algo&#xff0c;并结合路由侠内网穿透实现外网访问本地部署…

基础项目实战——学生管理系统(c++)

目录 前言一、功能菜单界面二、类与结构体的实现三、录入学生信息四、删除学生信息五、更改学生信息六、查找学生信息七、统计学生人数八、保存学生信息九、读取学生信息十、打印所有学生信息十一、退出系统十二、文件拆分结语 前言 这一期我们来一起学习我们在大学做过的课程…

实现基础的shell程序

1. 实现一个基础的 shell 程序&#xff0c;主要完成两个命令的功能 cp 和 ls 1.1.1. cp 命令主要实现&#xff1a; ⽂件复制⽬录复制 1.1.2. ls 命令主要实现&#xff1a; ls -l 命令的功能 1.1. 在框架设计上&#xff0c;采⽤模块化设计思想&#xff0c;并具备⼀定的可扩…

ADC 精度 第二部分:总的未调整误差解析

在关于ADC精度的第一篇文章中&#xff0c;我们阐述了模拟-数字转换器&#xff08;ADC&#xff09;的分辨率和精度之间的区别。现在&#xff0c;我们可以深入探讨影响ADC总精度的因素&#xff0c;这通常被称为总未调整误差&#xff08;TUE&#xff09;。 你是否曾好奇ADC数据表…

渲染流程概述

渲染流程包括 CPU应用程序端渲染逻辑 和 GPU渲染管线 一、CPU应用程序端渲染逻辑 剔除操作对物体进行渲染排序打包数据调用Shader SetPassCall 和 Drawcall 1.剔除操作 视椎体剔除 &#xff08;给物体一个包围盒&#xff0c;利用包围盒和摄像机的视椎体进行碰撞检测&#xf…

CF 764B.Timofey and cubes(Java实现)

题目分析 输入n个数字&#xff0c;首尾交换&#xff0c;奇数对换&#xff0c;偶数对不换 思路分析 存入数组&#xff0c;遍历时判断i%20时(数组下标0开始&#xff0c;所以题目分析没有错)&#xff0c;对换 代码 import java.util.*;public class Main {public static void ma…

Transformer+vit原理分析

目录 一、Transformer的核心思想 1. 自注意力机制&#xff08;Self-Attention&#xff09; 2. 多头注意力&#xff08;Multi-Head Attention&#xff09; 二、Transformer的架构 1. 整体结构 2. 编码器层&#xff08;Encoder Layer&#xff09; 3. 解码器层&#xff08;Decoder…

WPS mathtype间距太大、显示不全、公式一键改格式/大小

1、间距太大 用mathtype后行距变大的原因 mathtype行距变大到底怎么解决-MathType中文网 段落设置固定值 2、显示不全 设置格式&#xff1a; 打开MathType编辑器点击菜单栏中的"格式(Format)"选择"间距(Spacing)"在弹出的对话框中调整"分数间距(F…

C# 添加、替换、提取、或删除Excel中的图片

在Excel中插入与数据相关的图片&#xff0c;能将关键数据或信息以更直观的方式呈现出来&#xff0c;使文档更加美观。此外&#xff0c;对于已有图片&#xff0c;你有事可能需要更新图片以确保信息的准确性&#xff0c;或者将Excel 中的图片单独保存&#xff0c;用于资料归档、备…

Python练习(2)

今日题单 吃鱼还是吃肉 PTA | 程序设计类实验辅助教学平台 降价提醒机器人PTA | 程序设计类实验辅助教学平台 幸运彩票 PTA | 程序设计类实验辅助教学平台 猜帽子游戏 PTA | 程序设计类实验辅助教学平台 谁管谁叫爹 PTA | 程序设计类实验辅助教学平台 就不告诉你 PTA | 程…

Formality:黑盒(black box)

相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 简介 在使用Formality时&#xff0c;黑盒(black box)的概念很重要&#xff0c;指的是一个其功能未知的设计。黑盒通常用于设计中不可综合的组件&#xff0c;包括RAM…

开源2+1链动模式AI智能名片S2B2C商城小程序:利用用户争强好胜心理促进分享行为的策略研究

摘要&#xff1a;随着互联网技术的快速发展和社交媒体的普及&#xff0c;用户分享行为在企业营销中的作用日益凸显。本文旨在探讨如何利用用户的争强好胜心理&#xff0c;通过开源21链动模式AI智能名片S2B2C商城小程序&#xff08;以下简称“小程序”&#xff09;促进用户分享行…

八股学习 微服务篇

微服务篇 常见面试内容Spring Cloud 常见组件注册中心Ribbon负载均衡策略服务雪崩 常见面试内容 Spring Cloud 常见组件 Spring Cloud有5个常见组件&#xff1a; Eureka/Nacos:注册中心&#xff1b;Ribbon:负载均衡&#xff1b;Feign:远程调用&#xff1b;Hystrix/Sentinel:服…

Synology 群辉NAS安装(6)安装mssql

Synology 群辉NAS安装&#xff08;6&#xff09;安装mssql 写在前面mssql 2019:成功安装说明&#xff0c;这个最终成功了 mssql 2022没有成功1. pull image2.启动mssql docker container 远程连接 写在前面 mssq是一个重要节点。 这是因为我对mysql没有一丝好感。虽然接触了许…

mysql_init和mysql_real_connect的形象化认识

解析总结 1. mysql_init 的作用 mysql_init 用于初始化一个 MYSQL 结构体&#xff0c;为后续数据库连接和操作做准备。该结构体存储连接配置及状态信息&#xff0c;是 MySQL C API 的核心句柄。 示例&#xff1a; MYSQL *conn mysql_init(NULL); // 初始化连接句柄2. mysql_…

qt-QtQuick笔记之常见项目类简要介绍

qt-QtQuick笔记之常见项目类简要介绍 code review! 文章目录 qt-QtQuick笔记之常见项目类简要介绍1.QQuickItem2.QQuickRectangle3.QQuickImage4.QQuickText5.QQuickBorderImage6.QQuickTextInput7.QQuickButton8.QQuickSwitch9.QQuickListView10.QQuickGridView11.QQuickPopu…