题目
题目链接: https://leetcode-cn.com/problems/gas-station/
题目解析:问在何处出发时,可以环绕一周。
第一种方法:暴力解法(两次循环):直接看代码
第二种方法:
直接将每段路车最终能剩下的油算出来,如果加起来大于等于0则这段路就可以走的通,如果小于0则走不通
解决了走不走得通的问题,那就开始找,从哪里开始走。
如果A到不了B,那就从下一个加油站开始,遍历一遍数组找到一个可以走的地点。
代码
第一种:
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
//循环遍历
for(int i=0;i<gas.length;i++) {
//如果给的油比需要的油还要少,说明到达不了,如果多或者刚好则可以继续跑下去
if(gas[i]>=cost[i]) {
//记录跑过的加油站
int length=0;
//记录第几个加油站
int j=i;
if(i==gas.length-1)
j=0;
else
j+=1;
//g车里的油
int g=gas[i];
//c则是需要的油
int c=cost[i];
//循环遍历
while(length<gas.length) {
//先减去途中的油
g-=c;
//如果车里的油大于等于0则说明可以到达
if(g>=0) {
//如果所有加油站都跑完了,就返回最初的加油站
if(length==gas.length-1)
return i;
//车库里加油
g+=gas[j];
//更改需要消耗的油
c=cost[j];
//如果是最末尾的加油站,则改变j,开始循环
if(j==gas.length-1)
j=0;
else
j++;
length++;
}else
break;
}
}
}
return -1;
}
}
第二种:
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
//从开始点车里的油
int need = 0;
//从哪里开始
int start = 0;
//总共下来车里还剩多少油
int total = 0;
//循环遍历
for(int i = 0;i<gas.length;i++) {
//开始车里计算油
need = need + gas[i]-cost[i];
//加上这段路程车里剩的油
total += (gas[i]-cost[i]);
//如果车里油为负数,则走不到
if(need<0) {
//开始计算从下一个加油站出发
start = i+1;
need = 0;
}
}
//如果这段路可以走的下来,就返回初始加油站
if(total>=0)
return start;
else
return -1;
}
}