共计 1408 个字符,预计需要花费 4 分钟才能阅读完成。
加油站
题目形容:在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
你有一辆油箱容量有限的的汽车,从第 i 个加油站开往第 i+1 个加油站须要耗费汽油 cost[i] 升。你从其中的一个加油站登程,开始时油箱为空。
如果你能够绕环路行驶一周,则返回登程时加油站的编号,否则返回 -1。
阐明:
- 如果题目有解,该答案即为惟一答案。
- 输出数组均为非空数组,且长度雷同。
- 输出数组中的元素均为非正数。
示例阐明请见 LeetCode 官网。
起源:力扣(LeetCode)
链接:https://leetcode-cn.com/probl…
著作权归领扣网络所有。商业转载请分割官网受权,非商业转载请注明出处。
解法一:穷举法
从第一个加油站开始,判断从以后加油站开始作为终点是否能够环行一周回到终点,如果能够,则返回以后加油站的地位,如果不能够则将下一个加油站作为终点判断。具体判断某一个加油站作为终点是否能够环行的过程如下:
- 如果以后油量加上以后加油站的汽油量少于以后加油站的耗费,阐明无奈走到下一站,跳过这种可能性;
- 如果能够走到下一站,记录以后残余油量和曾经走过的加油站的数量,而后走到下一站,持续判断;
- 晓得走到最初,如果走过所有加油站,阐明以以后的起始加油站作为终点是能够环行一周的,返回起始加油站的地位。
public class LeetCode_134 {
/**
* 穷举法
*
* @param gas
* @param cost
* @return
*/
public static int canCompleteCircuit(int[] gas, int[] cost) {
// 总共有 n 个加油站
int totalN = gas.length;
// 从第一个加油站开始遍历
for (int i = 0; i < totalN; i++) {
int gasCount = 0, startStation = i, runStationCount = 0;
boolean flag = true;
while (runStationCount < totalN) {
// 如果以后油量加上以后加油站的汽油量少于以后加油站的耗费,阐明无奈走到下一站,跳过这种可能性
if (gasCount + gas[startStation] < cost[startStation]) {
flag = false;
break;
} else {
// 残余油量等于以后油量加上以后加油站的汽油量减去以后加油站的耗费
gasCount = gasCount + gas[startStation] - cost[startStation];
// 走过的加油站
runStationCount++;
// 下个加油站
startStation++;
if (startStation == totalN) {
// 如果下个加油站等于 n,从第一个加油站开始
startStation = 0;
}
}
}
if (flag && runStationCount == totalN) {return i;}
}
return -1;
}
public static void main(String[] args) {int[] gas = new int[]{1, 2, 3, 4, 5};
int[] cost = new int[]{3, 4, 5, 1, 2};
System.out.println(canCompleteCircuit(gas, cost));
}
}
【每日寄语】 世上无难事,只怕有心人。一个人在实现理想的过程中,会遇到很多的艰难,这不要紧,只有本人有那份心,保持做上来,你就会胜利。
正文完