在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。
你从其中的一个加油站出发,开始时油箱为空。如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。
说明:
如果题目有解,该答案即为唯一答案。
输入数组均为非空数组,且长度相同。
输入数组中的元素均为非负数。
示例代码:
package test;
import java.util.ArrayList;
import java.util.List;
public class TestCase {
public static void main(String[] args) {
int[] gas = new int[]{15, 2, 13, 6, 8};
int[] cost = new int[]{3, 2, 14, 16,3};
/*
* 1.判断是否有解第一步 BEGIN
*/
int gasSum = 0;
int costSum = 0;
for(int i = 0;i < gas.length; i++) {
gasSum += gas[i];
costSum += cost[i];
}
if(gasSum < costSum) {
System.out.println("无解");
return;
}
/*
* 判断是否有解第一步 END
*/
/*
* 2. 寻找解的可能起点 BEGIN
* 即:第一站的油要足以支撑到下一站,gas[i]>=cost[i]
*/
List<Integer> list = new ArrayList<>();
for(int i= 0; i < gas.length; i++) {
if(gas[i] >= cost[i]){
list.add(i);
}
}
/*
* 寻找解的可能起点 END
*/
/*3.寻找解
*
*/
for(int i = 0; i<list.size();i++) {
//初始化剩余量
int remain = 0;
//循环可能解的起点
int j = list.get(i);
//记录起点
int starrRecord = j;
//控制循环次数
int n = 0;
//for循环跳出条件 : 1.remain<0; 2 . 已经循环一圈
for(;n < gas.length;j++,n++) {
//为环形,若到数组末尾还未循环一圈,要返回数组开头
if(j >= gas.length) {
j = 0;
}
remain += gas[j]-cost[j];
if(remain < 0) {
break;
}
}
//若循环一圈后,没有break,即为解
if(n == gas.length) {
System.out.println(starrRecord);
}
}
/*3.寻找解 END
*
*/
}
}
2172

被折叠的 条评论
为什么被折叠?



