面试经典150题 day14
题目来源
我的题解
方法一 找最低点
参考 labuladong
找到最低点的下一个站 经过i之后变成最低点,则从i+1站开始
时间复杂度 :O(n)
空间复杂度:O(1)
java
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int n=gas.length;
int sum=0;
int start=0;
int minSum=0;
for(int i=0;i<n;i++){
sum+=gas[i]-cost[i];
if(sum<minSum){
// 经过第 i 个站点后,使 sum 到达新低
// 所以站点 i + 1 就是最低点(起点)
start=i+1;
minSum=sum;
}
}
if(sum<0){
// 总油量小于总的消耗,无解
return -1;
}
return start==n?0:start;
}
}
方法二 贪心
时间复杂度:O(n)
空间复杂度:O(1)
java
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int n=gas.length;
int sum=0;
int start=0;
int myGas=0;
for(int i=0;i<n;i++){
sum+=gas[i]-cost[i];
myGas+=gas[i]-cost[i];
// 如果选择站点 start 作为起点「恰好」无法走到站点 i,那么 start 和 i 中间的任意站点 k 都不可能作为起点。只能从i+1开始重新寻找可以作为起点的位置
if(myGas<0){
start=i+1;
myGas=0;
}
}
if(sum<0){
return -1;
}
return start==n?0:start;
}
}
有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~