20-加油站

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

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

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

思路分析

  1. 遍历每个加油站,计算从当前加油站出发,到下一个加油站时的剩余油量(即 gas[i] - cost[i]),并将其累加到总剩余油量 total 中。
  2. 同时,用一个变量 current 来记录从某个假设的起始加油站出发到当前加油站时的剩余油量。
  3. 如果在某一个加油站 i 处,current 的值小于 0,说明从之前假设的起始加油站出发无法到达当前加油站,此时将 current 重置为 0,并将起始加油站的候选值设为 i + 1
  4. 遍历完所有加油站后,如果 total 大于等于 0,说明总油量足够绕环路行驶一周,返回记录的起始加油站的候选值;否则返回 -1,表示无法绕环路行驶一周。

方法一

代码实现

function canCompleteCircuit(gas: number[], cost: number[]): number {const n = gas.length;let total = 0;let current = 0;let start = 0;for (let i = 0; i < n; i++) {const diff = gas[i] - cost[i];total += diff;current += diff;if (current < 0) {start = i + 1;current = 0;}}return total >= 0? start : -1;
}// 示例调用
const gas = [1, 2, 3, 4, 5];
const cost = [3, 4, 5, 1, 2];
const result = canCompleteCircuit(gas, cost);
console.log("可以绕环路行驶一周的出发加油站编号:", result);

代码解释

  1. 初始化变量
    • n 表示加油站的数量。
    • total 用于记录总的剩余油量,初始化为 0。
    • current 用于记录从某个假设的起始加油站出发到当前加油站时的剩余油量,初始化为 0。
    • start 用于记录可能的起始加油站编号,初始化为 0。
  2. 遍历加油站
    • 对于每个加油站 i,计算从该加油站到下一个加油站的剩余油量 diff = gas[i] - cost[i]
    • 将 diff 累加到 total 中,同时也累加到 current 中。
    • 如果 current 小于 0,说明从之前假设的起始加油站出发无法到达当前加油站,将 start 更新为 i + 1,并将 current 重置为 0。
  3. 判断结果
    • 遍历结束后,如果 total 大于等于 0,说明总油量足够绕环路行驶一周,返回 start;否则返回 -1,表示无法绕环路行驶一周。

复杂度分析

  • 时间复杂度:O(n),其中 n 是加油站的数量。因为只需要遍历一次 gas 和 cost 数组。
  • 空间复杂度:O(1),只使用了常数级的额外变量。

这种贪心算法的思路简单高效,能够在一次遍历中找到合适的起始加油站或者判断出无法绕环路行驶一周的情况。

 方法二

除了贪心算法,还可以使用暴力枚举的方法来解决这个问题。暴力枚举的思路很直接,就是从每一个加油站出发,模拟汽车的行驶过程,判断是否能够绕环路行驶一周。

以下是使用 TypeScript 实现的暴力枚举代码:

function canCompleteCircuit(gas: number[], cost: number[]): number {const n = gas.length;for (let start = 0; start < n; start++) {let currentGas = 0;let i = start;let flag = true;do {currentGas += gas[i];currentGas -= cost[i];if (currentGas < 0) {flag = false;break;}i = (i + 1) % n;} while (i!== start);if (flag) {return start;}}return -1;
}// 示例调用
const gas = [1, 2, 3, 4, 5];
const cost = [3, 4, 5, 1, 2];
const result = canCompleteCircuit(gas, cost);
console.log("可以绕环路行驶一周的出发加油站编号:", result);

代码解释

  1. 外层循环枚举起始加油站:通过 for 循环,从索引 0 到 n - 1 依次枚举每一个加油站作为起始加油站,这里的 n 是加油站的数量。
  2. 模拟行驶过程:对于每一个选定的起始加油站 start,初始化当前油量 currentGas 为 0,并设置一个标志位 flag 为 true,用于标记是否能够绕环路行驶一周。然后进入一个 do-while 循环,模拟汽车从当前加油站出发,依次前往下一个加油站的过程。
    • 在每次循环中,先将当前加油站的油量 gas[i] 加入到 currentGas 中,再减去行驶到下一个加油站所需的油量 cost[i]
    • 如果 currentGas 小于 0,说明在当前加油站油量不足,无法继续行驶,将 flag 设置为 false 并跳出循环。
    • 更新 i 为下一个加油站的索引,通过 (i + 1) % n 实现环形的索引处理。
    • 循环继续的条件是 i 不等于 start,即还没有绕环路行驶一周。
  3. 判断结果:如果在模拟行驶过程中 flag 始终为 true,说明从当前起始加油站出发可以绕环路行驶一周,返回当前起始加油站的索引 start;如果循环结束后没有找到这样的起始加油站,则返回 -1

复杂度分析

  • 时间复杂度:O(n^2),其中 n 是加油站的数量。外层循环枚举每个加油站作为起始点,时间复杂度为O(n) ,对于每个起始点,模拟行驶过程最多需要遍历一圈加油站,时间复杂度也为O(n) ,所以总的时间复杂度为O(n^2) 。
  • 空间复杂度:O(1),只使用了常数级的额外变量,如 currentGasiflag 等。

暴力枚举法虽然简单易懂,但时间复杂度较高,相比之下贪心算法在效率上更有优势。

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

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

相关文章

计算机三级网络技术备考

#subtotal 1Mbps1024kb128KB12.8M/s #1024B1KB 1024KB1MB 1024MB1GB #路由器的5G信号和平常的波长不同&#xff08;5G的穿墙性能差&#xff09; #局域网LAN&#xff08;一公里内——构成集线机、交换机、同轴电缆&#xff09; #城域网MAN&#xff08;几公里到几十公里——光…

IDEA 2024.1 最新永久可用(亲测有效)

今年idea发布了2024.1版本&#xff0c;这个版本带来了一系列令人兴奋的新功能和改进。最引人注目的是集成了更先进的 AI 助手&#xff0c;它现在能够提供更复杂的代码辅助功能&#xff0c;如代码自动补全、智能代码审查等&#xff0c;极大地提升了开发效率。此外&#xff0c;用…

30 分钟从零开始入门 CSS

前言 最近也是在复习&#xff0c;把之前没写的博客补起来&#xff0c;之前给大家介绍了 html&#xff0c;现在是 CSS 咯。 30分钟从零开始入门拿下 HTML_html教程-CSDN博客 一、CSS简介&#xff1a;给网页“化妆”的神器 CSS&#xff08;层叠样式表&#xff09;就像“化妆“&a…

Game Maker 0.11更新:构建社交竞速游戏并增强玩家互动

在这三部分系列中&#xff0c;我们将介绍如何实现Game Maker 0.11中一些最激动人心的新功能。 欢迎来到我们系列文章的第一篇&#xff0c;重点介绍了The Sandbox Game Maker 0.11更新中的新特性。 The Sandbox Game Maker 0.11是一个多功能工具&#xff0c;帮助创作者通过游戏…

软件供应链安全工具链研究系列——RASP自适应威胁免疫平台(上篇)

1.1 基本能力 RASP是一种安全防护技术&#xff0c;运行在程序执行期间&#xff0c;使程序能够自我监控和识别有害的输入和行为。也就是说一个程序如果注入或者引入了RASP技术&#xff0c;那么RASP就和这个程序融为一体&#xff0c;使应用程序具备了自我防护的能力&#xff0c;…

2024信息技术、信息安全、网络安全、数据安全等国家标准合集共125份。

2024信息技术、信息安全、网络安全、数据安全等国家标准合集&#xff0c;共125份。 一、2024信息技术标准&#xff08;54份&#xff09; GB_T 17966-2024 信息技术 微处理器系统 浮点运算.pdf GB_T 17969.8-2024 信息技术 对象标识符登记机构操作规程 第8部分&#xff1a;通用…

HTTP与网络安全

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、HTTPS和HTTP有怎样的区别呢&#xff1f;HTTPS HTTP SSL/TLS&#xff08;SSL或者TLS&#xff09; HTTP&#xff1a;应用层 SSL/TLS&#xff1a;协议中间层 …

ASP.NET Core 8.0学习笔记(二十八)——EFCore反向工程

一、什么是反向工程 1.原则&#xff1a;DBFirst 2.反向工程&#xff1a;根据数据库表来反向生成实体类 3.生成命令&#xff1a;Scaffold-DbContext ‘连接字符串’ 字符串示例&#xff1a; Server.;DatabaseDemo1;Trusted_Connectiontrue; MultipleActiveResultSets true;Tru…

Unity基础——资源导出分享为Unity Package

一.选中要打包的文件夹&#xff0c;右击&#xff0c;点击Exporting package 二.勾选 Include Dependencies&#xff0c;点击Export Include Dependencies&#xff1a;代表是否包含资源依赖的选项 三.选择保存的位置&#xff0c;即可生成Unity package 最终形成文件&#xff1a…

kafka-leader -1问题解决

一. 问题&#xff1a; 在 Kafka 中&#xff0c;leader -1 通常表示分区的领导者副本尚未被选举出来&#xff0c;或者在获取领导者信息时出现了问题。以下是可能导致出现 kafka leader -1 的一些常见原因及相关分析&#xff1a; 1. 副本同步问题&#xff1a; 在 Kafka 集群中&…

【Java企业生态系统的演进】从单体J2EE到云原生微服务

Java企业生态系统的演进&#xff1a;从单体J2EE到云原生微服务 目录标题 Java企业生态系统的演进&#xff1a;从单体J2EE到云原生微服务摘要1. 引言2. 整体框架演进&#xff1a;从原始Java到Spring Cloud2.1 原始Java阶段&#xff08;1995-1999&#xff09;2.2 J2EE阶段&#x…

内容中台的企业CMS架构是什么?

企业CMS模块化架构 现代企业内容管理系统的核心在于模块化架构设计&#xff0c;通过解耦内容生产、存储、发布等环节构建灵活的技术栈。动态/静态发布引擎整合技术使系统既能处理实时更新的产品文档&#xff0c;也能生成高并发的营销落地页&#xff0c;配合版本控制机制确保内…

Binder通信协议

目录 一,整体架构 二,Binder通信协议 三&#xff0c;binder驱动返回协议 四&#xff0c;请求binder驱动协议 一,整体架构 二,Binder通信协议 三&#xff0c;binder驱动返回协议 binder_driver_return_protocol共包含18个命令&#xff0c;分别是&#xff1a; 四&#xff0c…

react 中,使用antd layout布局中的sider 做sider的展开和收起功能

一 话不多说&#xff0c;先展示效果&#xff1a; 展开时&#xff1a; 收起时&#xff1a; 二、实现代码如下 react 文件 import React, {useState} from react; import {Layout} from antd; import styles from "./index.module.less"; // 这个是样式文件&#…

神经网络 - 激活函数(Sigmoid 型函数)

激活函数在神经元中非常重要的。为了增强网络的表示能力和学习能力&#xff0c;激活函数需要具备以下几点性质: (1) 连续并可导(允许少数点上不可导)的非线性函数。可导的激活函数可以直接利用数值优化的方法来学习网络参数. (2) 激活函数及其导函数要尽可能的简单&#xff0…

供应链管理系统--升鲜宝门店收银系统功能解析,登录、主界面、会员 UI 设计图(一)

供应链管理系统--升鲜宝门店收银系统功能解析&#xff0c;登录、主界面 会员 UI 设计图&#xff08;一&#xff09;

从零开始的网站搭建(以照片/文本/视频信息通信网站为例)

本文面向已经有一些编程基础&#xff08;会至少一门编程语言&#xff0c;比如python&#xff09;&#xff0c;但是没有搭建过web应用的人群&#xff0c;会写得尽量细致。重点介绍流程和部署云端的步骤&#xff0c;具体javascript代码怎么写之类的&#xff0c;这里不会涉及。 搭…

三轴加速度推算姿态角的方法,理论分析和MATLAB例程

三轴加速度推算三轴姿态的方法与MATLAB代码实现 文章目录 基本原理与方法概述静态姿态解算(仅俯仰角与横滚角)扩展(融合陀螺仪与加速度计)MATLAB代码 例程四元数动态姿态解算(融合加速度与陀螺仪)注意事项与扩展基本原理与方法概述 三轴加速度计通过测量重力分量在载体坐…

2025最新Flask学习笔记(对照Django做解析)

前言&#xff1a;如果还没学Django的同学&#xff0c;可以看Django 教程 | 菜鸟教程&#xff0c;也可以忽略下文所提及的Django内容&#xff1b;另外&#xff0c;由于我们接手的项目大多都是前后端分离的项目&#xff0c;所以本文会跳过对模板的介绍&#xff0c;感兴趣的朋友可…

HTML第二节

一.列表 1.列表的简介 2.无序列表 注&#xff1a;1.ul里面只能放li&#xff0c;不能放标题和段落标签 2.li里面可以放标题和段落等内容 3.有序列表 4.定义列表 注&#xff1a;要实现上图的效果需要CSS 二.表格 1.表格介绍 注&#xff1a;1.th有额外的效果&#xff0c;可以…