思路
暴力法
暴力破解,一方面验证自己对题目的理解是否正确,另一方面后续的优化也可以从这里入手。
1、考虑从第0
个点出发,能否回到第0
个点。
2、考虑从第1
个点出发,能否回到第1
个点。
3、考虑从第2
个点出发,能否回到第2
个点。
… …
4、考虑从第n
个点出发,能否回到第n
个点。
代码
//暴力法
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int n = gas.size();
//考虑从每一个点出发
for (int i=0;i<n;i++){
int j = i;
int remain = gas[i];
//当前剩余的油能否到达下一个点
while (remain-cost[j]>=0){
//减去花费的加上新的点的补给
remain = remain - cost[j] + gas[(j + 1) % n];
j = (j + 1) % n;
//如果j回到了i
if (j == i) {
return i;
}
}
}
return -1;
}
};
贪心法
说实话这个在LeetCode上看了很久的题解,但还是对于官方题解不是很懂,对于这个问题,主要参考了该博主的题解使用图的思想分析该问题
代码
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int len = gas.size();
int spare = 0;//总剩余汽油量
int minSpare = 9999999999;//最小的总剩余汽油量
int minIndex = 0;//记录出发点
for (int i=0;i<len;i++){
spare += gas[i] - cost[i];
if (spare<minSpare){
minSpare = spare;
minIndex = i;
}
}
return spare < 0 ? -1 : (minIndex + 1) % len;//minIndex+1%len为出发点
}
};