题目:有n个加油站首尾相连成一个圆,已知每个加油站的油量,以及从第i个加油站到第i+1个加油站需消耗的油量,问:能否开车从某个加油站出发,循环一圈又回到起点,如果可以返回出发的起点(车的邮箱容量是无限的)。

此题目来自于leetcode,其原文地址为:https://oj.leetcode.com/problems/gas-station/

此解决方法为自己原创,目前在网上也没有搜索到类似的。

算法时间复杂度为O(n),每个加油站只访问一次。 和网上看到的优雅方案(附后)不差上下。呵呵,纯粹个人感觉。

class Solution {
public:int canCompleteCircuit(vector<int> &gas, vector<int> &cost) {int start = gas.size()-1;int end = 0;int sum = gas[start] - cost[start];while (start > end) {if (sum >= 0) {sum += gas[end] - cost[end];++end;}else {--start;sum += gas[start] - cost[start];}}return sum >= 0 ? start : -1;}
};

代码提交到leetcode上,已经被Accepted了。

算法思路为:

1.  任取一个加油站,作为起点start,然后往前一直开,直到油不够。未能到达之站,记为end。

2.  此时,说明start不适合作起点站。则偿试以start的前面一站作为起点,并更新start,再次偿试,看能否开到站点end。

3.   如果不能开到站点end,说明此站也不合适,继续步骤2.

4.   如果能开到站点end,则继续往前开。直到油不够,并更新end指向此未到之站。继续步骤2.

5.   重复下去,直到start和end相遇。

在实现在,我将最后一个站点作为start,可以省去一个取模超作,即end前进可以简单的写作++end,而start后退可以简单的写作—start。

省去了写成 end = (end + 1)%N;  start =(start + N -1)%N;

此处贴上在网上看到的优雅方案,供大家比较。

public class Solution {public int canCompleteCircuit(int[] gas, int[] cost) {// Note: The Solution object is instantiated only once and is reused by each test case.int N = gas.length, startIndex = -1;int sum = 0, total = 0;for(int i = 0; i < N; i++){sum += (gas[i] - cost[i]);total += (gas[i] - cost[i]);if(sum < 0){startIndex = i; sum = 0;}}return total >= 0 ? startIndex + 1 : -1;}
}

注,此方案为Java语言实现,故接口与上C++实现略有不同。

要透彻理解上面两个算法,最好的方法是先理解下面这道证明题:

一个环形轨道上有n个加油站,所有加油站的油量总和正好够车跑一圈。证明,总能找到其中一个加油站,使得初始时油箱为空的汽车从这里出发,能够顺利环行一圈回到起点。
答案:总存在一个加油站,仅用它的油就足够跑到下一个加油站(否则所有加油站的油量加起来将 不够全程)。把下一个加油站的所有油都提前搬到这个加油站来,并把油已被搬走的加油站无视掉。在剩下的加油站中继续寻找油量足以到达下个加油站的地方,不断合并加油站,直到只剩一个加油站为止。显然从这里出发就能顺利跑完全程。
另一种证明方法:先让汽车油箱里装好足够多的油,随便从哪个加油站出发试跑一圈。车每到一个加油站时,记录此时油箱里剩下的油量,然后把那个加油站的油全部装上。试跑完一圈后,检查刚才路上到哪个加油站时剩的油量最少,那么空着油箱从那里出发显然一定能跑完全程。

该证明题摘抄自:http://www.matrix67.com/blog/archives/2671

实际上,

前一个算法,是基于证明方法一(合并加油站)上实现的。当然对其作了一点引申。

后一个算法,是基于证明方法二(即找到途中最小剩油量的加站)。当然也是作了一点引申。

作者: 静水流风

Gas Station (环形加油站)相关推荐

  1. 加油python_力扣——gas station (加油站) python实现

    题目描述: 中文: 在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升. 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] ...

  2. 134. Gas Station加油站

    [抄题]: There are N gas stations along a circular route, where the amount of gas at station i is gas[i ...

  3. LeetCode 134.Gas Station 解题分析

    题目来源: https://leetcode.com/problems/gas-station/description/ 题目描述: There are N gas stations along a ...

  4. PAT甲级1072 Gas Station (30 分):[C++题解]dijkstra算法、最短路

    文章目录 题目分析 题目来源 题目分析 来源:acwing 分析: 所有的dist[ ]都≤Ds:最小的dist[ ]最大; dist[ ] 总和最大. 由于加油站是字符,为了简单起见,将m个加油站编 ...

  5. pat 甲级 1072. Gas Station (30)

    1072. Gas Station (30) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A gas sta ...

  6. LeetCode 134 Gas Station

    LeetCode 134 Gas Station 水题,暴力一下就ok class Solution { public:int tag[100005];int sum[100005];int canC ...

  7. LeetCode 134. Gas Station

    LeetCode 134. Gas Station Solution1:我的答案,无数次试错得到的,不成系统,没有思路.. 时间复杂度O(n2)O(n2)O(n^2) class Solution { ...

  8. [leetcode] Gas Station

    题目描述: There are N gas stations along a circular route, where the amount of gas at stationi is gas[i] ...

  9. Leetcode 774. Minimize Max Distance to Gas Station

    LWC 69: 774. Minimize Max Distance to Gas Station 传送门:774. Minimize Max Distance to Gas Station Prob ...

  10. LWC 69: 774. Minimize Max Distance to Gas Station

    LWC 69: 774. Minimize Max Distance to Gas Station 传送门:774. Minimize Max Distance to Gas Station Prob ...

最新文章

  1. ubuntu下使用conda出现solving environment失败
  2. rpm批量卸载所有带有Java的文件
  3. Dev-Cpp 常用的快捷键(持续更新)
  4. Android 第九课 常用控件-------ListView
  5. 【福利】爱德华·阿什福德·李:人类与AI技术将是共生关系
  6. 输出绝对值(信息学奥赛一本通-T1040)
  7. YY语音招聘运维工程师(web方向),有兴趣的伙伴快来围观
  8. PostgreSQL大版本升级(pg_upgrade)11.7升12.2
  9. 百钱买百鸡问题python编程解决_百成大达物流单号查询
  10. 如何彻底杀掉nginx进程
  11. useCallback()和useMemo()的作用
  12. Mac下载配置aria2和baidudl
  13. matlab gui设置参数,基于Matlab/GUI界面设计的参数在线整定与优化(三)
  14. Hello Qt——QtDBus快速入门
  15. 如何将已有图片做成透明水印_如何给图片制作透明水印
  16. 计算机伦理学案例分析,医药伦理学案例分析
  17. django 关于视频播放
  18. Grafana的介绍与使用
  19. Ubuntu 高性能模式
  20. lsdyna批处理求解工具使用

热门文章

  1. 最少的脚本实现在NSH脚本作业中加入动态参数
  2. Matlab中的im2col函数
  3. JScript 06 根据成绩平均分划分等级
  4. C语言---1 C语言认知
  5. 计算语言学之语言理解与认知(1)
  6. android edittext底线,android – 更改edittext的底线颜色
  7. TypeScript查缺补漏
  8. python中的乘方_python中的乘方
  9. 十天干、十二地支的发音及含义
  10. SEO文章配图自动生成工具软件