题意:
解题思路:
思路:
1. 暴力解法O(n2):枚举每一个加油站作为起点,判断该起点的油能否到下一个加油站,如果不能则跳到下一个加油站作为起点,出发,直到环绕一周。
2. (优化) O(n):暂定i~j加油站能成功,但是i不能到达j+1加油站,则i~j中的所有加油站必然都不能到达j+1加油站,所以可以直接跳过j,从下一个j+1加油站作为起点,继续向下一个出发;
PHP代码实现:
class Solution {
/**
* @param Integer[] $gas
* @param Integer[] $cost
* @return Integer
*/
//暴力
function canCompleteCircuit($gas, $cost) {
$n = count($gas);
for ($i = 0; $i < $n; $i++) {
$tank = 0;
for ($j = $i; $j < $i + $n; $j++) {
$k = $j % $n;
$tank += $gas[$k] - $cost[$k];
if ($tank < 0) break;
}
if ($tank >= 0) return $i;
}
return -1;
}
//暴力优化
function canCompleteCircuitSkip($gas, $cost) {
$n = count($gas);
$j = 0;
for ($i = 0; $i < $n; $i = $j + 1) {
$tank = 0;
for ($j = $i; $j < $i + $n; $j++) {
$k = $j % $n;
$tank += $gas[$k] - $cost[$k];
if ($tank < 0) break;
}
if ($tank >= 0) return $i;
}
return -1;
}
//贪心算法
function canCompleteCircuitGreedy($gas, $cost) {
$total = 0;
$sum = 0;
$start = 0;
for ($i = 0; $i < count($gas); $i++) {
$total += $gas[$i] - $cost[$i];
$sum += $gas[$i] - $cost[$i];
// echo $total.'&&&&&'.$sum;echo PHP_EOL;
if ($sum < 0) {
$start = $i + 1;
$sum = 0;
}
}
return ($total < 0) ? -1 : $start;
}
}
GO代码实现:
func canCompleteCircuit(gas []int, cost []int) int {
n := len(gas)
for i := 0; i < n; i++ {
tank := 0
for j := i; j < i + n; j++ {
k := j % n
tank += gas[k] - cost[k]
if tank < 0 {
break
}
}
if tank >= 0 {
return i
}
}
return -1
}