【刷题笔记】加油站||符合思维方式
加油站
文章目录
- 加油站
- 1 题目描述
- 2 思路
- 3 解题方法
1 题目描述
https://leetcode.cn/problems/gas-station/
在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
给定两个整数数组 gas 和 cost ,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。
2 思路
正如大部分大佬所言,需要找到最小值所在的点。但是他们的代码写得有些含糊,我希望可以使用一种更加符合直觉的方式。
我们假设从i号加油站出发,然后用一张折线图表示到达每个加油站(最终返回i)时的剩余油量。x轴为加油站号,y轴为剩余油量。一开始的时候,剩余油量为0。首先来看一种可能的情况:
gas = [4, 3, 1, 2, 7, 4]
cost = [1, 2, 7, 3, 2, 5]
这里我们提供代码来表示从不同的站点出发,到达不同站点时候的剩余油量:
gas = [4,3,1,2,7,4]
cost = [1,2,7,3,2,5]
# 绘制
fig, axs = plt.subplots(1, 6, figsize=(20, 3))
for s in range(len(gas)):left_gas = [0 for _ in range(len(gas))]for i in range(len(gas)):left_gas[i] = (left_gas[i-1] if i > 0 else 0) + gas[(s + i) % len(gas)] - cost[(s + i) % len(gas)]left_gas.insert(0, 0)x = [(s + i) % len(gas) for i in range(len(gas))]x.append(s)axs[s].plot(range(len(gas) + 1), left_gas)axs[s].scatter(range(len(gas) + 1), left_gas)# 设置 x 轴刻度及标签axs[s].set_xticks(np.arange(len(gas) + 1))axs[s].set_xticklabels(x)# 绘制0刻度线axs[s].axhline(y=0, color='r', linestyle='-')# 将最低点标记出来,最低点的索引为left_gas.index(min(left_gas))axs[s].scatter(left_gas.index(min(left_gas)), min(left_gas), color='r')
plt.show()

你可以明显地看到从哪里出发,可以安全地开一圈了。(红线为0刻度线,红色点为最小点)
那么我们再举一个不可能开一圈的例子:
gas = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 0~9号加油站的油量
cost = [10, 9, 8, 7, 6, 5, 4, 3, 2, 11] # 0~9号加油站到下一站的消耗
其对应图像为

我这里也提供对应的绘图代码:
import matplotlib.pyplot as plt
import numpy as npgas = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 0~9号加油站的油量
cost = [10, 9, 8, 7, 6, 5, 4, 3, 2, 11] # 0~9号加油站到下一站的消耗# 绘制
# fig, axs = plt.subplots(1, 10, figsize=(20, 3))
# 上下两行,每行5个子图
fig, axs = plt.subplots(2, 5, figsize=(20, 6))
for s in range(len(gas)):left_gas = [0 for _ in range(len(gas))]for i in range(len(gas)):left_gas[i] = (left_gas[i - 1] if i > 0 else 0) + gas[(s + i) % len(gas)] - cost[(s + i) % len(gas)]left_gas.insert(0, 0)x = [(s + i) % len(gas) for i in range(len(gas))]x.append(s)# 设置 x 轴刻度及标签axs[int(s / 5)][s % 5].set_xticks(np.arange(len(gas) + 1))axs[int(s / 5)][s % 5].set_xticklabels(x)axs[int(s / 5)][s % 5].plot(range(len(gas) + 1), left_gas)axs[int(s / 5)][s % 5].scatter(range(len(gas) + 1), left_gas)# 绘制0刻度线axs[int(s / 5)][s % 5].axhline(y=0, color='r', linestyle='-')# 将最低点标记出来,最低点的索引为left_gas.index(min(left_gas))axs[int(s / 5)][s % 5].scatter(left_gas.index(min(left_gas)), min(left_gas), color='r')# 最低点设置垂直虚线,只往下画axs[int(s / 5)][s % 5].axvline(x=left_gas.index(min(left_gas)), color='r', linestyle='--')
plt.show()
什么情况下能转完一圈? 即总油量大于等于总耗油量。
3 解题方法
其实就是根据直觉,创建一个长度为gas.length + 1(参考上面的图,走一圈回来,相当于一共gas.length+1个站点)的数组left_gas(剩余油量),i位置初始为0,表示为在站点i出发时,剩余油量(或者说,初始油量)为0。
每两个站点之间的增加或者减少量是一定的,即任何两点之间连线的斜率是不变的(gas[i] - cost[i]),只要我们让最低值大于等于0,就可以保证走一圈。怎么让最低值大于等于0?只要我们让最低值为出发点,不就能保证其为0了?也就是能够保证最低点大于等于0。
所以,我们只需要找到最低点即可。
我们设置小车从0号站点出发,然后我们计算每个站点的剩余油量:
class Solution(object):def canCompleteCircuit(self, gas, cost):res = [0 for _ in range(len(gas) + 1)] # 剩余油量,为什么是len(gas) + 1,参考图中的x轴min_index = 0 # 初始站点min_left = 0 # 初始油量for i in range(len(gas)):res[i + 1] = res[i] + gas[i] - cost[i] # 例如,站点1的时候,剩余油量=res[0] + gas[0] - cost[0]if res[i + 1] < min_left: # 记录最低点的值和索引min_left = res[i + 1]min_index = i + 1return -1 if res[-1] < 0 else min_index # 到达最最终点的时候,相当于所有的gas相加,然后减去所有的cost,# 如果返回开头的时候,剩余油量小于0,则返回-1
相比之下,leetcode很多大佬的代码让我有点迷茫(没有说大佬写得不好,只是我有点难理解):
class Solution {public int canCompleteCircuit(int[] gas, int[] cost) {int sum = 0 ;int min_num = Integer.MAX_VALUE;int min_index = 0;for ( int i = 0 ; i < gas.length ; i ++){sum += gas[i] - cost[i];if(sum<=min_num && gas[(i+1)%gas.length] >0){min_index = i;min_num = sum;}}return sum < 0 ? -1 : (min_index +1 ) % gas.length;}
}
相关文章:
【刷题笔记】加油站||符合思维方式
加油站 文章目录 加油站1 题目描述2 思路3 解题方法 1 题目描述 https://leetcode.cn/problems/gas-station/ 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i1 个加油站需要消…...
【ArcGIS Pro微课1000例】0037:ArcGIS Pro中模型构建器的使用---以shp批量转kml/kmz为例
文章目录 一、ArcGIS Pro模型构建器介绍二、shp批量转kml/kmz1. 打开模型构建器2. 添加工作空间4. 添加【创建要素图层】工具5. 添加【图层转kml】工具6. 输出文件命名7. 运行模型三、模型另存为1.py文件2. 保存为工具一、ArcGIS Pro模型构建器介绍 模型构建器是一种可视化编程…...
前端 vue 面试题(二)
文章目录 如何让vue页面重新渲染组件间通信vue为什么要mutation、 action操作插槽、具名插槽、作用域插槽vue编译使用的是什么库?vue怎么实现treeshakingwebpack实现treeshaking为什么只有es module 能支持 tree shaking mixin 的作用mixin的底层原理nexTick原理vue…...
MySQL 高可用架构
MySQL 是实际生产中最常用的数据库,生产环境数据量极为庞大,对性能和安全要求很高,单机的 MySQL 是远远达不到的,所以必须搭建一个主从复制架构,同时可以基于一些工具实现高可用架构,在此基础上,…...
JVM虚拟机:G1垃圾回收器的日志分析
本文重点 本文我们将学习G1垃圾回收器的日志 使用 执行命令 java -Xms20M -Xmx20M -XX:PrintGCDetails -XX:UseG1GC 类名 分析 前面我们学习了G1垃圾回收器,它的回收有三种可能: YGC FGC MixedGC GC pause表示STW,Evacuation表示复制对象,…...
解决视口动画插件jquery.aniview.js使用animate.css时无效的问题(最新版本网页视口动画插件的使用及没作用、没反应)
当网站页面元素进入视口时自动应用过渡效果。CSS过渡效果可以为网页添加动画效果,并提供了一种平滑的转换方式,使元素的变化更加流畅和生动。而通过jQuery插件来获取页面滚动位置决定合适调用动画效果。 一、官网 animate.css官网 一款强大的预设css3动…...
【挑战业余一周拿证】一、亚马逊云科技简介 - 第 3 节 - 云计算
第 3 节 - 云计算 在深入了解亚马逊云科技的各个部分之前,让我们先缩小视野,对云进行一个合理的定义。云计算就是通过互联网按需提供 IT 资源并采用按需付费定价模式,下面,我们将进行详细说明。 按需提供表示的是亚马逊云科技会在…...
4. 无向图的各连通分支
题目 求解无向图的各连通分支 输入: 第一行为图的节点数n(节点编号0至n-1,0<n<10) 从第二行开始列出图的边,-1表示输入结束 输出: 输出每个连通分支的广度优先搜索序列(从连通分支的最…...
《golang设计模式》第三部分·行为型模式-08-状态模式(State)
文章目录 1. 概念1.1 作用1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1. 概念 1.1 作用 状态(State)指状态对象,用于封装上下文对象的特定状态行为,使得上下文对象在内部状态改变时能够改变其自身的行为。 1.1 角色…...
tp8 使用rabbitMQ(3)发布/订阅
发布/订阅 当我们想把一个消息,发送给 多个消费者的时候,我们把这种模式叫做发布/订阅模式,比如我们做两个消费者,其中一个消费者把消息写入磁盘中,别一个消费者把消息结果输出到屏幕上,就要用到发布订阅模…...
【nlp】3.4 Transformer论文复现:2. 编码器部分(规范化层、子层连接结构、编码器层)
3.4 Transformer论文复现:2. 编码器部分(规范化层、子层连接结构、编码器层) 2.6 规范化层2.6.1 规范化层的作用2.6.2 规范化层的代码实现2.6.3 规范化层总结2.7 子层连接结构2.7.1 子层连接结构2.7.2 子层连接结构的代码实现2.7.3 子层连接结构总结2.8 编码器层2.8.1 编码器…...
面试:ShardingSphere问题
文章目录 什么是ShardingSphere,它的主要功能是什么?ShardingSphere的核心模块有哪些?他们是如何工作的?ShardingSphere 的读写分离是如何实现的?如何配置ShardingSphere的数据分片策略?ShardingSphere支持…...
NX二次开发UF_CURVE_ask_offset_direction_2 函数介绍
文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_offset_direction_2 Defined in: uf_curve.h int UF_CURVE_ask_offset_direction_2(UF_STRING_p_t input_curves, double offset_direction_vector [ 3 ] , double dra…...
【研究中】sql server权限用户设置23.11.26
--更新时间2023.11.26 21:30 负责人:jerrysuse DBAliCMSIF EXISTS (select * from sysobjects where namehkcms_user)--判断是否存在此表DROP TABLE hkcms_user CREATE TABLE hkcms_user (id int primary key identity(1, 1),username char(32) NOT N…...
java多线程一
1、什么是线程 线程(Thread)是一条程序内部的一条执行流程。 程序中如果只有一条执行流程,那这个程序就是单线程的程序。 2、什么是多线程 多线程(multithreading),是指从软件或者硬件上实现多个线程并发执…...
电脑技巧:电脑常见蓝屏、上不了网等故障及解决办法
目录 一、电脑蓝屏 常见原因1: 病毒木马 常见原因2: 安装了不兼容的软件 二、电脑不能上网 常见原因1: 新装系统无驱动 常见原因2: DNS服务器异常 常见原因3: 硬件问题 三、电脑没声音 常见原因1: 未安装驱动 常见原因2: 硬件故障 四、电脑屏幕不显示 常见原因1: 显…...
大语言模型损失函数详解
我们可以把语言模型分为两类: 自动回归式语言模型:自动回归式语言模型在本质上是单向的,也就是说,它只沿着一个方向阅读句子。正向(从左到右)预测;反向(从右到左)预测。…...
Spring Boot 3 集成 Knife4j
基础环境 SpringBoot : 3.0.6 Java: jdk-17.0.5 Maven: 3.6.1依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xs…...
BetaFlight模块设计之三十六:SoftSerial
BetaFlight模块设计之三十六:SoftSerial 1. 源由2. API接口2.1 openSoftSerial2.2 onSerialRxPinChange2.3 onSerialTimerOverflow2.4 processTxState2.5 processRxState 3. 辅助函数3.1 applyChangedBits3.2 extractAndStoreRxByte3.3 prepareForNextRxByte 4. 总结…...
PC访问华为昇腾开发板的摸索过程
作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> 最近要折腾华为昇腾开发板(官方名称叫:Atlas 200I DK)。先是按照官方教程折腾:Atlas200DK环境部署。我发现…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
