- 算法
- 1.如果gas总和小于cost总和,一定不存在答案
- 2.如果gas总和大于等于cost总和,一定存在答案
- 因为题目给定答案唯一,所以遍历一遍数组之后,最终使得从start开始gas[i]-cost[i]之和大于等于0的那个位置即是答案
public int canCompleteCircuit(int[] gas, int[] cost) {
int sumGas = 0, sumCost = 0, start = 0, tank = 0;
for (int i = 0; i < gas.length; i++) {
sumGas += gas[i];
sumCost += cost[i];
tank += gas[i] - cost[i];
if (tank < 0) {
start = i + 1;
tank = 0;
}
}
return sumGas < sumCost ? -1 : start;
} func canCompleteCircuit(gas []int, cost []int) int {
sumGas, sumCost := 0, 0
start, tank := 0, 0
for i := range gas {
sumGas += gas[i]
sumCost += cost[i]
tank += gas[i] - cost[i]
if tank < 0 {
start = i + 1
tank = 0
}
}
if sumGas < sumCost {
return -1
} else {
return start
}
} - 算法
- 1.新定义left数组记录每个位置gas[i]-cost[i]的值
- 2.选择left[i]大于等于0的位置开始,检查是否可以环行一周,中间如果出现油箱没有油了就停止检查当前left[i],继续检查下一个left[i]
public int canCompleteCircuit(int[] gas, int[] cost) {
int n = gas.length;
int[] left = new int[n];
for (int i = 0; i < n; i++) {
left[i] = gas[i] - cost[i];
}
for (int i = 0; i < n; i++) {
if (left[i] >= 0) {
int sum = left[i], j = 1;
while (j < n) {
sum += left[(i+j)%n];
if (sum < 0) {
break;
}
j++;
}
if (j == n) {
return i;
}
}
}
return -1;
} func canCompleteCircuit(gas []int, cost []int) int {
n := len(gas)
left := make([]int, n)
for i := range left {
left[i] = gas[i] - cost[i]
}
for i := range left {
if left[i] >= 0 {
sum := left[i]
j := 1
for j < n {
sum += left[(i+j)%n]
if sum < 0 {
break
}
j++
}
if j == n {
return i
}
}
}
return -1
}