1.无脑全部遍历
public class leetcode {
public static void main(String[] args) {
int[] gas = {2, 3, 4};
int[] cost = {3, 4, 3};
System.out.println(castGas(gas, cost));
}
public static int castGas(int[] gas, int[] cost) {
int no = -1;
int i = 0;
int a = 0;
for (i = 0; i < gas.length; i++) {
int haveGas = 0;
a = 0;
for (int j = i; a < gas.length; j++, a++) {//不一定从0号开始所以用a计数,
if (j == gas.length) {
j = 0;
}
haveGas += gas[j];
if (haveGas < cost[j]) {
haveGas = 0;
no = -1;
break;
}
haveGas -= cost[j];
if (a + 1 == gas.length) {
no = i;
return no;
}
}
}
return no;
}
}
超时。
想法一:只有sum(gas) > sum(cast)才有可能成立
想法二:0号到n+1号不行的话,1号到n+号也不行
有:从0号开始遍历当油不够的时候从下一起点开始遍历,判断遍历过的站点数,遍历到的站点数大于总站点数时可以退出遍历输出-1
代码如下
public class leetcode {
public static void main(String[] args) {
int[] gas = {1,2,3,4,5};
int[] cost = {3,4,5,1,2};
System.out.println(castGas(gas, cost));
}
public static int sum(int[] arrs){
int sum = 0;
for (int i: arrs){
sum += i;
}
return sum;
}
public static int castGas(int[] gas, int[] cost) {
if(sum(cost) > sum(gas)){求和判断
return -1;
}
int begin = 0;//开始站点
int a = 0;//该次for循环循环次数
int haveGas = 0;//油量
int i = 0;//当前到达的站点
int number = 0;//遍历过的站点数
while(number <= gas.length) {//遍历完所有站点后退出循环,返回-1
a = 0;
haveGas = 0;
for (; a <= gas.length - 1; i++, a++) {//第一次循环从0号开始
if(i == gas.length){
i = 0;
}
haveGas += gas[i];
if (haveGas < cost[i]) {//当油不够的时候结束for循环,将开始站点设置为i+1
i = i + 1;
begin = i;
number++;
break;
}
haveGas -= cost[i];
number++;
if (a + 1 == gas.length) {//成立代表以begin为起点加油站开始已经走了一周
return begin;
}
}
}
return -1;
}
}
如有错误请批评指正