当前位置: 首页 > news >正文

贪心算法-加油站

一、题目描述

二、解题思路

1.运动过程分析

        这里需要一个油箱剩余油量的变量resGas,初始化resGas=0;还需要一个标记从什么位置当做初始位置的startIdx,初始化startIdx=0。

        我们从数组下标idx=0处开始向后遍历,初始时startIdx=0,遇到下标为idx的加油站时,看邮箱内此时剩余油量能否到达下一个油站:

        resGas=resGas+gas[i]-cost[i]

        当resGas>=0时,可以到达下一个油站;

        当resGas<0时,不可以到达下一个油站,此时也意味着从startIdx开始运动到达不了idx位置,从startIdx到idx之间的所有位置也同样不可达idx此时把startIdx设置为idx+1。

        这里用startIdx->idx小车运动不可达的图示解释一下上面标注黄色部分:

2.可以循环的条件判断

        这里需要注意的是,小车从startIdx->加油站数组末尾时,如果可达,需要将idx=(idx+1)%gas.length,如果整个过程一直可达,等到二次循环idx+1==startidx时,意味着从startIdx开始行驶一定可以循环一周,返回startIdx。所以我们还要添加一个变量标注一下此时是否已经二次循环,实现代码内用newloop来标识

3.不可以循环的条件判断

        不存在循环一周的情况:当二次循环过程中还是出现了不可达的情况,那么就意味着不存在循环的情况,返回-1,图示:

        就意味着从startIdx到末尾之间的元素和下标0到下标3之间的所有元素下标3都不可达,此前已经确定了从下标0到下标4之间的元素已经不可达,所以肯定不能形成循环。

        整个过程需要执行两次数组遍历,所以时间复杂度为O(n),效率还是可以的。

三、代码实现

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param gas int整型一维数组 * @param cost int整型一维数组 * @return int整型*/public int gasStation (int[] gas, int[] cost) {// 就从0开始寻找,设置油箱剩余量resGas,int len=gas.length;int startidx=0,residx=0;int resGas=0;//初始时油箱剩余油量为0int nowidx=0;boolean newloop=false;while(nowidx<len){int nowGas=resGas+gas[nowidx]-cost[nowidx];if(nowidx+1==len){newloop=true;}if(nowGas<0){//表示从startidx开始到达不了startidx=(nowidx+1)%len;resGas=0;if(newloop){residx=-1;break;}}else{//表示当前油量还可以支撑往后走resGas=nowGas;if(newloop&&((nowidx+1)%len==startidx)){residx=startidx;break;}}nowidx=(nowidx+1)%len;}return residx;}
}

四、刷题链接

加油站_牛客题霸_牛客网

相关文章:

  • c#与汇川plc通信
  • STM32 HAL库开发——入门篇(3):OLED、LCD
  • 骑砍2霸主MOD开发(11)-瓦兰迪亚火骑兵
  • k8s使用yml文件部署
  • 【Vue】——组件的注册与引用
  • 默认launcher
  • 鸿蒙OS初识
  • Python的Pillow(图像处理库)的一些学习笔记
  • docker实战命令大全
  • 【Python】使用flask作为web服务器
  • “薅羊毛”到被“割韭菜”,警惕网络副业陷井
  • 基于电荷的EPFL HEMT模型
  • 使用Ollama+OpenWebUI本地部署Gemma谷歌AI开放大模型完整指南
  • 【论文速读 | USENIX Security‘2022】Debloating Address Sanitizer
  • Python下载库
  • [ JavaScript ] 数据结构与算法 —— 链表
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • Android组件 - 收藏集 - 掘金
  • Apache Zeppelin在Apache Trafodion上的可视化
  • C# 免费离线人脸识别 2.0 Demo
  • Codepen 每日精选(2018-3-25)
  • express如何解决request entity too large问题
  • go语言学习初探(一)
  • Java Agent 学习笔记
  • JavaScript 奇技淫巧
  • JavaScript设计模式之工厂模式
  • Java比较器对数组,集合排序
  • js对象的深浅拷贝
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • spring security oauth2 password授权模式
  • Webpack 4 学习01(基础配置)
  • 后端_ThinkPHP5
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 每天10道Java面试题,跟我走,offer有!
  • 模仿 Go Sort 排序接口实现的自定义排序
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #Datawhale AI夏令营第4期#AIGC方向 文生图 Task2
  • $forceUpdate()函数
  • (2)(2.10) LTM telemetry
  • (PySpark)RDD实验实战——取一个数组的中间值
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (不用互三)AI绘画工具应该如何选择
  • (二)丶RabbitMQ的六大核心
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (学习日记)2024.01.19
  • (一)认识微服务
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • ./configure,make,make install的作用(转)
  • .NET 回调、接口回调、 委托
  • .net操作Excel出错解决
  • .NET程序集编辑器/调试器 dnSpy 使用介绍