加油站
題目描述:在一條環路上有 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));
}
}
【每日寄語】 世上無難事,只怕有心人。一個人在實現理想的過程中,會遇到很多的困難,這不要緊,只要自己有那份心,堅持做下去,你就會成功。