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.
思路:
贪心算法 每一个进行尝试,尝试到j,如果测试不通过就继续i=j+1 或者往前搜索
我的代码:
public class Solution { public int canCompleteCircuit(int[] gas, int[] cost) { if(gas == null || gas.length == 0 || cost == null || cost.length == 0 || gas.length != cost.length) return -1; int n = gas.length; int [] gap = new int[n]; for(int i = 0; i < n; i++) { gap[i] = gas[i] - cost[i]; } int last = n - 1; int right = 0; int sum = 0; while(right <= last) { sum += gap[right]; if(sum < 0) { while(right <= last) { sum += gap[last]; if(sum < 0) { last--; } else { right++; last--; break; } } } else right++; } if(sum < 0) return -1; return (right) % n; } }
他人代码:
- 从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表示能不能走一圈。
public class Solution { public int canCompleteCircuit(int[] gas, int[] cost) { if (gas == null || cost == null || gas.length == 0 || cost.length == 0) { return -1; } int sum = 0; int total = 0; int index = -1; for(int i = 0; i<gas.length; i++) { sum += gas[i] - cost[i]; total += gas[i] - cost[i]; if(sum < 0) { index = i; sum = 0; } } return total < 0 ? -1 : index + 1; } }
学习之处:
- 这个思想是最重要的:如果sum < 0,说明从i开始是不行的。那能不能从i..j中间的某个位置开始呢?既然i出发到i+1是可行的, 又i~j是不可行的, 从而发现i+1~ j是不可行的。
更加易于理解的解法:
https://blog.csdn.net/mine_song/article/details/70049821
posted on 2015-03-23 15:58 zhouzhou0615 阅读(146) 评论(0) 编辑 收藏 举报