从零学算法134

news/2024/9/20 1:27:15/ 标签: 算法

134.加油站
在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
给定两个整数数组 gas 和 cost ,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。
示例 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 可为起始索引。
示例 2:
输入: gas = [2,3,4], cost = [3,4,3]
输出: -1
解释:
你不能从 0 号或 1 号加油站出发,因为没有足够的汽油可以让你行驶到下一个加油站。
我们从 2 号加油站出发,可以获得 4 升汽油。 此时油箱有 = 0 + 4 = 4 升汽油
开往 0 号加油站,此时油箱有 4 - 3 + 2 = 3 升汽油
开往 1 号加油站,此时油箱有 3 - 3 + 3 = 3 升汽油
你无法返回 2 号加油站,因为返程需要消耗 4 升汽油,但是你的油箱只有 3 升汽油。
因此,无论怎样,你都不可能绕环路行驶一周。
提示:
gas.length == n
cost.length == n
1 <= n <= 105
0 <= gas[i], cost[i] <= 104

  • 暴力解法(超时):最容易想到的,就是暴力解法直接二重循环,从每个点开始往后跑一圈,中途只要出现剩余油量小于 0 的情况就表示无法跑通,否则说明可以行驶一圈。
  •   public int canCompleteCircuit(int[] gas, int[] cost) {int n = gas.length;for(int i = 0; i < n; i++){// 剩余油量int rest = gas[i] - cost[i];int index = (i + 1) % n;while(rest >= 0 && index != i){rest += gas[index] - cost[index];index = (index + 1) % n;}// 剩余油量大于等于 0 且 index 回到了 i// 就说明能跑完一圈if(rest >= 0 && index == i)return i;}return -1;}
    
  • 全局贪心:三种情况。
    1. 总油量小于总花费,也就是总的剩余油量 remain 小于 0,那怎么都跑不通一圈
    2. 从 0 开始跑一圈,期间最小剩余油量 min 大于等于 0,说明就没缺过油,跑通了,从 0 开始可行
    3. min 小于 0,说明起点在非 0 点,因为我们是从前往后找到 min,所以我们只要从后往前,直到某个点最终能把负值填平,这个点就是起点。
    4. 比如例子 1,我们在 2 处剩余最少的 -6 的油量;从后往前试图填平,假设在 4 处携带了 -6 的油量,到 3 处剩余 0,说明我们从 3-4 能积攒 6 的油量,继续从 4-0-1-2 此时到 2 处最终会剩余 0 油量而不是 -6,因为 3-4 的 6 油量能把 0-1-2 的 -6 油量填平。并且我们直接从后往前找,也因为 [0,2] 不可行那么这个区间内任何一点到 2 也都不可行。也就是说起点只可能在 [3,4]
  •   public int canCompleteCircuit(int[] gas, int[] cost) {int n = gas.length;// 总剩余油量int remain = 0;// 从 0 开始跑一圈最少的剩余油量int min = Integer.MAX_VALUE;for(int i = 0; i < n; i++){remain += gas[i] - cost[i];if(remain < min)min = remain;}if(remain < 0) return -1; // 情况 1if(min >= 0) return 0; // 情况 2// 情况 3for(int i = n - 1; i >= 0; i--){min += gas[i] - cost[i];if(min >= 0)return i;}return -1;}
    
  • 贪心:既然 [i,j] 的剩余油量小于 0 就表示起点只可能是 [j+1, n],那么我们就用 curRemain 记录当前剩余油量,如果小于 0 就更新起点 start 为当前遍历下标 i + 1,直到跑到终点,只要 remain 不小于 0 那么 start 就为最终答案
  •   public int canCompleteCircuit(int[] gas, int[] cost) {int curRemain = 0;int remain = 0;int start = 0;for(int i = 0; i < gas.length; i++){curRemain += gas[i] - cost[i];remain += gas[i] - cost[i];// 说明 0,1,2...i 不可能为起点,那么假设从 i+1 刚开始跑// 只要 i+1 能跑到终点不出现 remain 小于 0 就表示 i+1 为起点if(curRemain < 0){start = i + 1;curRemain = 0;}}if(remain < 0) return -1; // 情况 1return start;}
    

http://www.ppmy.cn/news/1433373.html

相关文章

redis单线程模型

工作原理 在Redis中&#xff0c;当两个客户端同时发送相同的请求时&#xff0c;Redis采用单线程模型来处理所有的客户端请求&#xff0c;会依次处理这些请求&#xff0c;每个请求都会按照先后顺序被执行&#xff0c;不会同时处理多个请求。使得Redis能够避免多线程并发访问数据…

S-Edge网关:柔性部署,让物联网接入更统一

S-Edge网关是什么&#xff1f; 网关是在实际物理世界与虚拟网络世界相连接的交叉点&#xff0c;为了让这个交叉点尽可能的复用&#xff0c;无需每种设备都配套一种连接方式&#xff0c;边缘网关主要就是用于传感器等物理设备与网络实现数据交互的通用设备&#xff0c;也称为物…

Python 环境管理工具:Conda

目录 一、Conda介绍 二、安装Conda 2.1 下载Anaconda 安装程序 2.2 执行安装 2.3 初始化Conda 2.4 配置镜像源 三、Conda常用命令 3.1 环境管理命令 3.2 包管理命令 3.3 配置相关命令 3.4 其他常用命令 一、Conda介绍 Conda 是一个开源的跨平台包…

ubuntu 23.04 Dell T3660 听歌没声音的尝试

首先&#xff0c;还是要安装PulseAudio Volume Control sudo apt install pulseaudio 或者 snap install pulseaudio 装了pulseaudio可以在configure和playback间切换选择用哪个声卡输出声音&#xff0c;一般选Stereo Analog Output 网上其他办法也可以试试&#xff0c;比…

HashTable ,HashMap,和ConcurrentHashMap的区别

这里呢&#xff0c;在我们学习多线程之前&#xff0c;HashMap,在数据结构中我们都已经非常熟悉了&#xff0c;HashMap&#xff0c;有key和value&#xff0c;key和value都是一一对应的关系。key允许为null。 而当我们学习过线程之后呢&#xff0c;HashMap是线程不安全的。 而Has…

【LeetCode热题100】【多维动态规划】最小路径和

题目链接&#xff1a;64. 最小路径和 - 力扣&#xff08;LeetCode&#xff09; 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 经典动态规…

【iOS】类与对象底层探索

文章目录 前言一、编译源码二、探索对象本质三、objc_setProperty 源码探索四、类 & 类结构分析isa指针是什么类的分析元类元类的说明 五、著名的isa走位 & 继承关系图六、objc_class & objc_objectobjc_class结构superClassbitsclass_rw_tclass_ro_tro与rw的区别c…

银河麒麟V10 SP1服务器客户端定时数据同步

银河麒麟V10 SP1服务器客户端定时数据同步 0.概述 当前只测试了将数据从客户端往服务端推送&#xff0c;两个客户端分别推送不同的数据 1.环境 三台电脑均为银河麒麟V10SP1桌面操作系统 服务器IP&#xff1a;192.168.1.51 用户名&#xff1a;wlh 客户端IP&#xff1a;192…

什么是架构?说说我的理解

什么是架构了&#xff1f;其实就是根据企业的具体情况给出的一个解决方案&#xff0c;并且这个架构能升级&#xff0c;如果企业的流量突然暴增&#xff0c;也能适应变化&#xff0c;这才是好的架构&#xff0c;一个项目是采用单体架构了&#xff1f;还是采用前后端分离&#xf…

elment ui 中el-input标签中@input初始化赋值触发问题

遇见问题记录起来&#xff0c;方便以后隔了很久再次遇到。 elment ui 中el-input标签中input初始化赋值时会触发到input方法 <el-input-numberv-model"scope.row.discount_value":controls"false":min"0":precision"0"input"…

练习题(2024/4/23)

1分发糖果 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果&#xff0c;计算并返回…

解密数字化工业革命:数字孪生工厂和信息集成

数字孪生工厂与信息集成&#xff01; 虚拟工厂是将实体工厂映射过来&#xff0c;具备仿真、管理和控制实体工厂关键要素功能的模型化平台。数字孪生技术将虚拟工厂的概念不断深入&#xff0c;利用物联网技术和监控技术加强信息管理服务&#xff0c;通过合理计划排程&#xff0c…

设计模式(四):单例模式

设计模式&#xff08;四&#xff09;&#xff1a;单例模式 1. 单例模式的介绍2. 单例模式的类图3. 单例模式的实现3.1 懒汉式&#xff08;线程不安全&#xff09;3.2 懒汉式&#xff08;线程安全&#xff09;3.3 饿汉式3.4 静态内部类3.5 枚举 1. 单例模式的介绍 单例模式&…

git常见命令(成长版)

ps&#xff1a;所谓成长版就是后续可能还会添加命令&#xff1a; 1.删除本地分支&#xff1a; git branch -d 分支名 2.拉取代码后默认master分支&#xff0c;切换到线上其他分支&#xff1a; &#xff08;1&#xff09;查看线上所有分支&#xff1a; git branch -a &#…

ES6 - 语法糖

ES6 引入了许多新的语法糖和方法&#xff0c;其中一些包括&#xff1a; 箭头函数&#xff1a;() > {} 模板字符串&#xff1a;${variable} 解构赋值&#xff1a;const { prop } object 类和继承&#xff1a;class MyClass extends ParentClass {} Promise&#xff1a;…

【华为OD机试】精准核酸检测【C卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 为了达到新冠疫情精准防控的需要,为了避免全员核酸检测带来的浪费,需要精准圈定可能被感染的人群。现在根据传染病流调以及大数据分析,得到了每个人之间在时间、空间上是否存在轨迹交叉…

【详细讲解Edge使用心得与深度探索】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

【神经网络基础辨析】什么是神经网络的主干(backbone)、颈部(neck)和头部(head)网络

在神经网络中&#xff0c;通常将网络分为三个部分&#xff1a;骨干网络&#xff08;Backbone&#xff09;、颈部网络&#xff08;Neck&#xff09;、和头部网络&#xff08;Head&#xff09;。 骨干网络&#xff08;Backbone&#xff09; 骨干网络通常是神经网络的主要部分&a…

立即刷新导致请求的response没有来得及加载造成的this request has no response data available

1、前端递归调用后端接口 const startProgress () > {timer.value setInterval(() > {if (progress.value < 100) {time.value--;progress.value Math.ceil(100 / wait_time.value);} else {clearInterval(timer.value);progress.value 0;timer.value null;time.…

【嵌入式】Arduino IDE + ESP32开发环境配置

一 背景说明 最近想捣鼓一下ESP32的集成芯片&#xff0c;比较了一下&#xff0c;选择Arduino IDE并添加ESP32支持库的方式来开发&#xff0c;下面记录一下安装过程以及安装过程中遇到的坑。 二 下载准备 【1】Arduino IDE ESP32支持一键安装包&#xff08;非常推荐&#xff0…