LeetCode134,加油站

难度:中等

博主空间与往期力扣

题目链接


目录

作者原始思路

"隐藏式"贪心算法

思想与代码简述

问题

反省

最优易解法-图表法

案例分析

算法思想

代码实现

代码分析

结论


作者原始思路

"隐藏式"贪心算法

class Solution {public int canCompleteCircuit(int[] gas, int[] cost) {var isReach = 0;var begin = 0;for (int i = 0; i < gas.length; i++) {isReach += (gas[i] - cost[i]);}if (isReach < 0) {return -1;}else {for (int i = 0; i < gas.length; i++) {var temp = 0;for (int j = i; j < gas.length; j++) {temp += (gas[j] - cost[j]);if (j == i && temp <= 0) {break;}}if (temp > isReach) {begin = i;isReach = temp;}}return begin;}}
}

思想与代码简述

  • 首先,明确一个概念,如果一辆车能走完全程,即全部的加油站都路过一次,那么说明在这个过程中所加的油一定大于他所消耗的油
  • 其次,策略是我们最开始走的时候应该处于加油量永远大于消耗量的加油站,即盈余油量的最初位置,这是我们贪心的方向
    • 1.同时遍历两个数组,将他们做差,就可以得出走到某个地方的油量
    • 2.用最终的油量进行比较,若大于0,说明走完还有油量,可以进行进一步判断,否则说明不能走完
    • 3.贪心的步骤就是从第i个位置开始,将后面的所有油量差做和,求出总和,再算出最大的位置,从而得出最优的盈余位置
    • 4.如果一开始就是负数,说明该位置不可能达到最大,可以立即退出

问题

反省

  • 有时候遇到这种题目,有时候真的没有想到有这么极端的案例,所以,我们要多刷题,优化自己的算法,争取通过全部案例
  • 这里有个有趣的现象,就是我使用贪心算法的时候,其实我不知道自己用了贪心算法,但是后来细想了一下才直到,所以,贪心算法内化于心最重要
  • 遇到这种题目,显然又要用一些奇奇怪怪的算法,隆重推出图表法

最优易解法-图表法

案例分析

  • gas = [1,2,3,4,5]
  • cost = [3,4,5,1,2]
  • 作图得
    • 作图技巧

      • 1.根据每一个gas和costs画出各个加油站的盈余情况,将盈余做累加,描绘出曲线的点
      • 2.将各个点连接起来,获得油量变化曲线图
      • 3.应该把第一个点前面的那一段画起来,具有连贯性,且(0,0)这个点表示的是5,从而从图示上代表了公路形成一个有效的圆环,与题目相互对应,对后面的代码理解具有及其重要的作用

算法思想

  • 1.根据图示得,开始时的油量为负数,最终的油量为0,所以能到达,若最后的油量小于0,说明油量不足消耗量,不可能到达
  • 2.由生活实际得,我们从起点到终点,应该保证油量永远都大于等于0,否则无法到达
  • 3.上述图示是以1为起点,一次到达加油站[2,3,4,5]的,我们发现,其油量曲线永远小于0
  • 4.由于盈余情况是肯定的,所以曲线的增减趋势也是一定的,所以我们应该要处于最下面的点去到>=0的位置,这就保证了所有的点都在0的上面
  • 5.所以,我们找出最小的那一个点,以他作为开始的位置,保证了所有的点都在0上方

代码实现

class Solution {public int canCompleteCircuit(int[] gas, int[] cost) {var minGas = Integer.MAX_VALUE;var minGasIndex = 0;var curGas = 0;var len = gas.length;for (int i = 0; i < len; i++) {curGas += gas[i] - cost[i];if (curGas < minGas) {minGas = curGas;minGasIndex = i;}}return curGas < 0 ? -1 : (minGasIndex + 1) % len;}
}

代码分析

  • 1.变量分析

    • 1.1minGas 油量曲线图中,最下面的点
    • 1.2minGasIndex 油量曲线图中最下面点对应的下标
    • 1.3curGas 油量曲线图中的点
    • 1.4数组长度
  • 2.遍历
    • 2.1获取当前当前盈余值(gas[i] - const[i]),并作累加获取curGas
    • 2.2获取最小值及其下标
  • 3.如果curGas < 0,说明消耗量大于油量,返回-1,否则返回( (minGasIndex + 1) % len)
    • 解释

      • 因为我们要让最小的那个点在0的上方,所以,所以不妨把他看成是图示中的(0,0)点,图示中表示5,那么这里表示最小值对应的点,
      • 根据思路,我们是从下一个位置开始走的,所以,开始位置是(minGasIndex + 1),即上述最小的那个点要最后才可以到达
      • 对于取模的思路
        • 如果示例为[3,1,1] [1,2,2]根据算法和图示,可以得出从1开始其所有的curGas都是大于0的,所以1就是正确位置,但是,算法的结果是3,所以取模的话刚好回到0,

结论

这个图解法我觉得是相对于官方算法更为直观和容易理解的一个算法,官方用的数学累加,懒得看,不直观,不推荐,不过,这个图解法更加的抽象,相对对于一部分人而言更加难理解,但是,这种算法是给人眼前一亮的,所以,我非常的推荐,我来总结一下几点

1.(0,0)这个点的含义,以及后面的应用

                2.图示每一个元素的意义

                        3.如何用表格推出算法

LeetCode琅琊榜第九层-加油站问题(图表法)相关推荐

  1. LeetCode琅琊榜第二层-最长回文子串问题(动态规划)

    LeetCode_5.最长回文字串 难度:中等 关注博主,持续输出优质算法内容 题目链接 目录 1.暴力求解法

  2. 计算机网络中各层的协议图表(TCP/IP)

    计算机网络中各层的协议图表:

  3. TF之CNN:CNN实现mnist数据集预测 96%采用placeholder用法+2层C及其max_pool法+隐藏层dropout法+输出层softmax法+目标函数cross_entropy法+

    TF:TF下CNN实现mnist数据集预测 96%采用placeholder用法+2层C及其max_pool法+隐藏层dropout法+输出层softmax法+目标函数cross_entropy法+A ...

  4. 01背包问题:图表法带你快速理解动态规划解决01背包问题 附C++源码

    0-1背包问题 所谓0-1背包问题,也就是给你一个重量为M的背包和n种物品,每种物品有一定的重量和价值,在每种物品均可装入背包1次或不装入(不能仅装入物品的一部分)且不超过背包载重量的前提下,问你怎样 ...

  5. LeetCode琅琊榜第十六层-Z字型变换(直接构造法 + 周期性算法)

    LeetCode6.Z字形变换 难度:中等 往期力扣与博主空间 题目链接  目录 官方解法1-构造Z字型数组模拟 案例分析 规律探索 原因: 代码实现 代码分析: 问题 官方解法二-压缩上述二维数组 ...

  6. 目标层准则层MATLAB,层次分析法-MATLAB

    层次分析法-MATLAB 第八章 层次分析法 层次分析法(Analytic Hierarchy Process,简称AHP)是对一些较为复杂.较为模糊的问题作出决策的简易方法,它特别适用于那些难于完全 ...

  7. LeetCode 1161. 最大层内元素和(层序遍历)

    1. 题目 给你一个二叉树的根节点 root.设根节点位于二叉树的第 1 层,而根节点的子节点位于第 2 层,依此类推. 请你找出层内元素之和 最大 的那几层(可能只有一层)的层号,并返回其中 最小 ...

  8. LeetCode 37. Sudoku Solver--数独求解(回溯法)--Java 3ms,Python 80ms 解法

    题目地址: Write a program to solve a Sudoku puzzle by filling the empty cells. A sudoku solution must sa ...

  9. Leetcode 17.电话号码的组合(回溯法)

    Time: 20191005 Type: Medium 题目描述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字 ...

最新文章

  1. 如何使用 ASP.NET 实用工具加密凭据和会话状态连接字符串
  2. 终结谷歌AutoML的真正杀手!Saleforce开源TransmogrifAI
  3. 【Docker】网络模式
  4. MAC IOS ssh 连接下修改环境变量
  5. php获取表单信息的代码_PHP获取HTML文件名表单数据等
  6. js清空文本框的值_一个Vue.js实例控制字变大变小,含样式操作,flex布局。「603」...
  7. openssh升级后无法登陆解决方案
  8. equals和== 的用法
  9. matlab 提取图像轮廓(图像边缘提取)
  10. StackOverflow
  11. XCodeGhost
  12. 协议森林1——小喇叭开始广播:以太网与WiFi
  13. 中职计算机录取分数线是多少,中职技校录取分数线划定
  14. iOS基础-小Demo--刮开涂层(刮刮乐效果)
  15. UVA 1589 xiangqi
  16. TikTok怎么运营带货
  17. 3.21bootstrap
  18. 螺丝钉 IT人员 感悟 -- 别让 IT成为金钱的奴隶(希望引起 大家的共鸣)
  19. flink-cdc,clickhouse写入,多路输出
  20. Vungle激励广告接入——最白话,手把手教你做系列。

热门文章

  1. 揣着一口袋的阳光满载而归--爱摸鱼的美工(13)
  2. 【LeetCode】179. 最大数
  3. 使用长角牛演示:防止ARP被攻击的原理和配置----------划水也别忘记学着玩
  4. Oracle Golden Gate 系列一 -- GG 架构 说明
  5. 推特错误,呃,出错了,请稍后重试
  6. 竹云+巨杉丨互信认证 安全可靠
  7. 用python赚零花钱_买不起猪肉了?用Python炒股赚点零花钱吧
  8. 破解人脸识别被判七年!打击黑产,鼓励人脸识别技术健康发展
  9. git:SSL证书问题:无法获取本地颁发者证书
  10. 蚂蚁资深技术专家刘晓莹十年支付宝回忆录