leetcode 134 加油站

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

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

其实题目想要表达的意思就是,在一个环形数组中,找一个起点,从这起点开始(gas[i]-cost[i])的累加和一直大于0,

先把便利环形数组的技巧:对数组索引累加操作之后 对 数组长度进行取余数下面会在代码中体现:

第一种方式:暴力求解,依次以环形数组的每一个位置作为起点,看能否绕环路行驶一周;

public int canCompleteForce(int[] gas, int[] cost) {int n = gas.length;for(int i = 0; i < gas.length;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; // 同上}    // index == i 说明已经环绕一周// rest > 0 说明剩余的油量 这两个条件缺一不可,自己手写的时候,就把这个条件忘记if (index == i && rest >= 0)  return i;}return -1;}// 思路一样 实现略微区别
public int canCompleteForceV2(int[] gas, int[] cost) {int n = gas.length;for(int i = 0;i < n;i++){int curSum = 0;for(int step = 0;step < n;step++){int index = (i + step) % n;curSum += gas[index] - cost[index];if(curSum < 0) break;}if(curSum >= 0 ) return i;}return -1;}

第二种:从整体的角度思考问题
1.情况一 :如果整体的加油站的油量 减去 所有消耗的油量小于0,那么无论从哪个加油站出发,都无法行驶一周
2. 情况二 : rest[i] = gas[i]-cost[i]为一天剩下的油,i从0开始计算累加到最后一站,如果累加没有出现负数,说明从0出发,油就没有断过,那么0就是起点
3.情况三:如果累加值的最少是负数,汽车从非0出发;我们可以从后向前,看从哪一个开始,可以把这个负数填平;

public int canCompleteEagerV1 (int[] gas,int[] cost) {int n = gas.length;int total = 0,min = Integer.MAX_VALUE;for(int i = 0; i < n;i++){total += gas[i] - cost[i]; //累加剩余油量if(min > total) min = total;}if(total < 0) return -1; //情况1if(min >= 0) return 0; //情况二for(int i = n - 1;i > 0;i--){ // 情况三min += gas[i] - cost[i];if(min >= 0) return i;}return -1;}

第三种思路 贪心算法:
定义rest[i] = gas[i] - cost[i]; 代表是经过第i个加油站后(从i个到第i+1个加油站),剩余的油量
这道题有一个隐藏很深的规律,在区间[i,j]进行累加和rest[i…j];

如果「恰好」在j处,出现了累加和小于0,那么说明无法从i到达j+1(这是因为res[j],从j到j+1的剩余燃油量),重点来了,这时从[i+1,j]作为起点也是无法到达到达j+1的,为什么呢? 「恰好」在j处 出现累加和大于零,也就是说 在[i+1,j-1]区间的任意个一个加油站,累加和都是大于0的(相当于初始油量大于0) 此时让初始油量等于0,更不可能到达j+1加油站

public int canCompleteEagerV2 (int[] gas,int[] cost) {int curSum = 0,sum = 0,n = gas.length;int i = 0,start = 0;while(i < n){sum += gas[i] - cost[i];curSum += gas[i] - cost[i];if(curSum < 0) {curSum = 0;start = i + 1;}i++;}return sum < 0 || start == n ? -1 :start;}

欢迎大家评论区讨论

加油站-问题详解(暴力-整体-贪心)相关推荐

  1. 手撕yolo3系列——详解yolo3整体网络代码(详细注释)

    完整代码百度云直达链接(包含预训练权重)(小白注释) https://pan.baidu.com/s/1US6e93OaCYOghmF21v0UIA 提取码:z8at 参考链接 [注]代码是大神的代码 ...

  2. 一、全国医保接口开发详解(整体介绍)

    一.开发过程 1.需求分析 第一.首先肯定要仔细阅读接口文档,设计接口系统整体架构,也就是接口系统.HIS系统.医保系统各自的职责. 搞清楚文档接口要实现的技术,是调用程序库的方式还是webapi方式 ...

  3. okhttp3 请求html页面,OkHttp3源码详解(二) 整体流程

    1.简单使用 同步:@Override public Response execute() throws IOException { synchronized (this) { if (execute ...

  4. 【胖虎的逆向之路】02——Android整体加壳原理详解实现

    [胖虎的逆向之路](02)--Android整体加壳原理详解&实现 Android Apk的加壳原理流程及详解 文章目录 [胖虎的逆向之路](02)--Android整体加壳原理详解& ...

  5. 李沐d2l《动手学深度学习》第二版——风格迁移源码详解

    本文是对李沐Dive to DL<动手学深度学习>第二版13.12节风格迁移的源码详解,整体由Jupyter+VSCode完成,几乎所有重要代码均给出了注释,一看就懂.需要的同学可以在文末 ...

  6. UNIPRO NL协议详解

    UFS协议系列文章目录 UNIPRO系列文章传送门: UNIPRO TL协议详解 UNIPRO DL协议详解之整体概述 UNIPRO DL协议详解之流控机制 UNIPRO DL协议详解之重传机制 MP ...

  7. VINS技术路线与代码详解

    VINS技术路线 写在前面:本文整和自己的思路,希望对学习VINS或者VIO的同学有所帮助,如果你觉得文章写的对你的理解有一点帮助,可以推荐给周围的小伙伴们,当然,如果你有任何问题想要交流,欢迎随时探 ...

  8. Hector SLAM 原理详解、算法解析

    目录 1.原理详解 2.算法解析 1.原理详解 Hector整体算法很直接,就是将激光点与已有的地图"对齐",即扫描匹配.扫描匹配就是使用当前帧与已经有的地图数据构建误差函数,使用 ...

  9. 贪心算法思想详解+示例代码

    CSDN话题挑战赛第2期 参赛话题:学习笔记 文章目录 五大算法思想 贪心算法 举例说明 选择排序 删除数字 寻找数字最大和 买股票 最大回文字符串 背包问题 小结 五大算法思想 分治思想 贪心算法/ ...

最新文章

  1. String.hashCode 哈希值出现重复?
  2. getattr的巨大作用
  3. JZOJ 5107. 【GDSOI2017】 中学生数据结构题
  4. 【传智播客】JavaWeb程序设计任务教程 第四章练习答案
  5. Angularjs1.x 项目结构
  6. android ocr识别源码_身份证识别OCR解决手动输入繁琐问题
  7. 递归求n的阶层算法实现
  8. Python实现抓取CSDN博客首页文章列表
  9. jQuery 中的事件参数传递机制
  10. 时间复杂度O(n^2)和O(nlog n)差距有多大?
  11. 马斯克扎心了!猎鹰重型火箭核心助推器运输过程中坠海
  12. 测试面试题集-Python列表去重
  13. 什么样的 python 可以可谓专业 PyPI 项目?刚刚学到三个概念:pep8、Sphinx、pytest与GitHub Action的集成
  14. Mugeda(木疙瘩)H5案例课—教学课件如何做-岑远科-专题视频课程
  15. 腾讯认证QQ空间秒升级为专业版方法!
  16. 你的下一台电脑何必是电脑,探索不一样的远程操作
  17. 贝多芬《 d小调第九交响曲》(Symphony No.9 in d Minor, Op.125, 1824)(永无完结)
  18. oracle双活数据中心建设_双活数据中心 是什么
  19. 4K视频剪辑、特效合成、调色完美硬件配置方案2018
  20. MyBatis-Plus之多租户架构(Multi-tenancy)——SAAS

热门文章

  1. 51nod_2369 奈芙莲的序列(动态规划)
  2. python等待执行完毕 再继续执行_如何等待一个函数内部异步执行完毕再执行另外一个函数?...
  3. 【Domoticz】玩转Domoticz平台——配合ESPEasy固件,开个头,以后玩起来起来再更新博客
  4. 中文分词之维特比算法详解
  5. Java基础知识(一) 基本概念
  6. Kafka学习之Replication tools之Reassign Partitions Tool
  7. 前端开发最基本的3个语言
  8. 智能优化算法:侏儒猫鼬优化算法-附代码
  9. echart结合高德地图的数据可视化大数据展示平台模板
  10. 【What if 系列】拖住那架飞机!