https://leetcode.cn/problems/gas-station/
题目要求
在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
给定两个整数数组 gas 和 cost ,如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。
暴力
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int n = gas.length;
for (int i = 0; i < n; i++) {
int count = gas[i] - cost[i];
int index = (i + 1) % n;
while (count > 0 && index != i) {
count += gas[index] - cost[index];
index = (index + 1) % n;
}
if (count >= 0 && index == i)
return i;
}
return -1;
}
}
- 超时
贪心+全局最优
public int canCompleteCircuit(int[] gas, int[] cost) {
int n = gas.length;
int cur = 0, min = Integer.MAX_VALUE;
for (int i = 0; i < n; i++) {
cur += gas[i] - cost[i];
if (cur < min) min = cur;
}
if (cur < 0) return -1;
if (min >= 0) return 0;
for (int i = n - 1; i >= 0; i--) {
min += gas[i] - cost[i];
if (min >= 0) return i;
}
return -1;
}
贪心
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int n = gas.length;
int total = 0, cur = 0;
int res = 0;
for (int i = 0; i < n; i++) {
total += gas[i] - cost[i];
cur += gas[i] - cost[i];
if (cur < 0) {
res = i + 1;
cur = 0;
}
}
if (total < 0) return -1;
return res;
}
}
- 首先如果总油量减去总消耗大于等于零那么一定可以跑完一圈,说明 各个站点的加油站 剩油量相加一定是大于等于零的。每个加油站的剩余量为
gas[i] - cost[i]
。 i
从0
开始累加,和记为curSum
,一旦curSum
小于零,说明[0, i]
区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1
算起,再从0
计算curSum
。