LeetCode: Gas Station 解题报告
Gas Station
There are N gas stations along a circular route, where the amount of gas at station i is gas[i].
You have a car with an unlimited gas tank and it costs cost[i] of gas to travel from station i to its next station (i+1). You begin the journey with an empty tank at one of the gas stations.
Return the starting gas station's index if you can travel around the circuit once, otherwise return -1.
Note:
The solution is guaranteed to be unique.
Greedy
SOLUTION 1:
引自Lexi's Leetcode solutions 的解答:
- 从i开始,j是当前station的指针,sum += gas[j] – cost[j] (从j站加了油,再算上从i开始走到j剩的油,走到j+1站还能剩下多少油)
- 如果sum < 0,说明从i开始是不行的。那能不能从i..j中间的某个位置开始呢?既然i出发到i+1是可行的, 又i~j是不可行的, 从而发现i+1~ j是不可行的。
- 以此类推i+2~j, i+3~j,i+4~j 。。。。等等都是不可行的
- 所以一旦sum<0,index就赋成j + 1,sum归零。
- 最后total表示能不能走一圈。
以上做法,其实是贪心的思想:
也就是说brute force的解是 : 一个一个来考虑, 每一个绕一圈, 但是 实际上 我们发现 i - j不可行 直接index就跳到j+1, 这样周而复始,很快就是绕一圈 就得到解了。
算法证明:
1. 我们要证明当total > 0的时候,我们一定存在一个点,从它开始,可以绕一圈。
证明以下设定:
我们假定对任意i, j (i: 0 ~ len-1, j: 0 ~ len-1),我们寻找sum = Σ (gas[k]-cost[k]) (k 从i到j) ,使sum 最大。我们从i出发,一定可以绕一圈。
i x x x x j x x x x m x
(1)假定存在这个一个m点,从i点出发,到m点会total(i-m) < 0. 也就是说从i出发不可以走完全程。
=> 因为Total > 0 而 total(i-m)<0 ,则必然 total ((m+1) ~ (i-1)) > 0 ,那么我们可以得出total ((m+1) ~ j) > total(i-j),与total(i-j)是最大sum相违背。
=> 根据反证法,上述推定不能成立。所以不会存在这样一个m点,使total(i-m) < 0。也就是说从i出发,我们可以跑完全程。
2. 从1中我们可以看到,只要找到这样一个i-j区间,我们就能使汽车从i点出发,能够跑完全程。按照我们目前使用的算法,只要找到任何一个负区间,我们就丢弃,向下一个区间寻找,这其实就是找最大sum的算法。(因为前面如果是负区间你可以不加他们)最后得到的index实际上就是i (j我们并没有计算,实际上再从0 的index往后寻找一些正的station加上即是j的边界)。
所以从index出发汽车一定可以跑完一圈。另外,这样的解应该不止一个,在i-j之间,从i到n(n在i-j之间)都是可能的解。
实际上只要使total(n~j) >= -total(j+1 ~ i-1)即可, 同样假设假定存在这个一个m点,从n点出发,到m点会total(n-m) < 0. 则因为total(n~j) >= -total(j+1 ~ i-1),同样可以推出total ((m+1) ~ (i-1)) > 0,与以上证明类似,同样会推翻题设。
例如:total(n~j) = 10, total(j+1 ~ i-1) = -9,如果total(n-m)= -1 ,则total ((m+1) ~ (i-1)) = 2 > 0
3. 总结:从i到m只要满足total(n~j) >= -total(j+1 ~ i-1)的点,都是可能的可以出发的点
public class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
if (gas == null || cost == null || gas.length == 0 || cost.length == 0) {
// Bug 0: should not return false;
return -1;
}
int total = 0;
int sum = 0;
int startIndex = 0;
int len = gas.length;
for (int i = 0; i < len; i++) {
int dif = gas[i] - cost[i];
sum += dif;
if (sum < 0) {
// Means that from 0 to this gas station, none of them can be the solution.
startIndex = i + 1; // Begin from the next station.
sum = 0; // reset the sum.
}
total += dif;
}
if (total < 0) {
return -1;
}
return startIndex;
}
}
GITHUB:
https://github.com/yuzhangcmu/LeetCode_algorithm/blob/master/greedy/CanCompleteCircuit.java
LeetCode: Gas Station 解题报告的更多相关文章
- 【LeetCode】Gas Station 解题报告
[LeetCode]Gas Station 解题报告 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/gas-station/#/descr ...
- 【leetCode百题成就】Gas Station解题报告
题目: There are N gas stations along a circular route, where the amount of gas at station i is gas[i]. ...
- [LeetCode] 134. Gas Station 解题思路
There are N gas stations along a circular route, where the amount of gas at station i is gas[i]. You ...
- LeetCode: Combination Sum 解题报告
Combination Sum Combination Sum Total Accepted: 25850 Total Submissions: 96391 My Submissions Questi ...
- [leetcode]Gas Station @ Python
原题地址:https://oj.leetcode.com/problems/gas-station/ 题意: There are N gas stations along a circular rou ...
- [LeetCode] Gas Station 加油站问题
There are N gas stations along a circular route, where the amount of gas at station i is gas[i]. You ...
- [LeetCode] Gas Station
Recording my thought on the go might be fun when I check back later, so this kinda blog has no inten ...
- 【LeetCode】Permutations 解题报告
全排列问题.经常使用的排列生成算法有序数法.字典序法.换位法(Johnson(Johnson-Trotter).轮转法以及Shift cursor cursor* (Gao & Wang)法. ...
- [LeetCode] Gas Station,转化为求最大序列的解法,和更简单简单的Jump解法。
LeetCode上 Gas Station是比较经典的一题,它的魅力在于算法足够优秀的情况下,代码可以简化到非常简洁的程度. 原题如下 Gas Station There are N gas stat ...
随机推荐
- linux中的signal机制(转)
信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念.Linux对信号机制的大致实现方法.如何使用信号,以及有关信号的几个系统调用. 信号机制是进程之间相互传递消息的一种方法,信号全 ...
- VS2010调试多进程
http://msdn.microsoft.com/zh-cn/library/ms123401.aspx 选择启动项目 在“解决方案资源管理器”中,右击项目名,然后在快捷菜单上单击“设为启动项目”. ...
- 解决UEditor将div标签换成p标签的问题
原文链接 将设计排版好的页面html代码上传到数据库,再读取出来的时候发现所有的div都被替换成了p标签. 解决方法: 首先在ueditor.all.js文件内搜索allowDivTransToP,找 ...
- 【SqlServer】SQL Server的常用函数
字符串函数 SubString():用于截取指定字符串的方法.该方法有三个参数:参数1:用于指定要操作的字符串.参数2:用于指定要截取的字符串的起始位置,起始值为 1 .参数3:用于指定要截取的长度. ...
- 12C -- 配置EM Express的端口
EM Express是基于web接口的图形化数据库管理工具. 内嵌到数据库中,可以用来监控.管理数据的性能和完成大多数管理工作. EM Express是轻量级的管理工具,减少了数据库服务器的开销.没有 ...
- 【转】Scheme 编程环境的设置
Scheme 编程环境的设置 介绍了这么久的 Scheme,却没有讲过如何配置一个高效的 Scheme 的编程环境.有些人开始学习 Scheme 的时候感觉无从下手,所以今天讲一下它的配置. Sche ...
- process credentials(一)
一.介绍 当linux系统中的一个进程运行起来的时候,总是要访问系统的资源,访问文件或者向其他的进程发送信号.系统是否允许其进行这些操作?系统是根据什么来判断该进程的权限?这些问题是和进程信任状(pr ...
- Python 文件 readlines() 方法
概述 Python 文件 readlines() 方法用于读取整个文件(所有行)到一个列表,可以由for... in ... 结构进行遍历.列表的每一行变成列表的每一个元素. 语法 readlines ...
- Java读取excel的示例
一.引用的jar包,apache的POI // https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml compile group: ' ...
- FileZilla FTP 登录 问题
1.一直报错220 (vsFTPd 3.0.2)-AUTH TLS 将加密方式选择为 “只是用普通FTP(不安全)”模式即可 2.服务器发回了不可路由的地址 “传输设置”,传输模式设置为主动.