问题
例子
思路
-
方法1
-
方法2
代码
//方法0:更容易
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
//找到从下标0开始,最缺油的地方,然后return 该下标+1
int min_index=-1;
int min = Integer.MAX_VALUE;;
int now=0;
for(int i=0; i<gas.length; i++) {
now+=gas[i]-cost[i];
if(now<min) {
min=now;
min_index=i;
}
}
//如果油量<耗油,返回-1
return now<0?-1:(min_index+1)%gas.length;
}
}
//方法1
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
//rest为从下标0到i剩余油量,run为从起点到i剩余油量
int rest=0,run=0,start=0;
for(int i=0; i<gas.length; i++) {
run += gas[i]-cost[i];
rest+= gas[i]-cost[i];
//油不够从i->i+1,0->i站剩余油量都是>=0,每减少一站,就少了一些剩余油量。所以如果从i前的站点作为起始站,剩余油量不可能冲过i+1站
if(run<0) {
start = i+1;
run = 0;
}
}
//start最大为len-1,start值从0开始验证的,不可能len-1之后,再去验证0下标
return rest<0?-1:start;
//我自己的
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int sum_gas=0,sum_cost=0;
for(int i=0; i<gas.length; i++) {
sum_gas += gas[i];
sum_cost+= cost[i];
gas[i] = gas[i]-cost[i];
}
if(sum_cost>sum_gas) return -1;
for(int i=0; i<gas.length; i++) {
if(gas[i]>=0){//>=0即可,=0时正好
if(get(gas,i)==true) return i;
}
}
return -1;
}
public boolean get(int[] gas, int i) {
int res=0;
for(int j=i; j<gas.length; j++) {
res += gas[j];
if(res<0) return false;
}
for(int j=0; j<i; j++) {
res += gas[j];
if(res<0) return false;
}
return true;
}
}