class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int min = Integer.MAX_VALUE;
int cursum = 0;
for(int i = 0;i < gas.length;i++){
int rest = gas[i] - cost[i];
cursum += rest;
if(min > cursum) min = cursum;
}
//情况1
if(cursum < 0) return -1;
//情况2
if(min >= 0) return 0;
//情况3
for(int i = gas.length - 1; i >= 0;i--){
int rest = gas[i] - cost[i];
min += rest;
if(min >= 0) return i;
}
return -1;
}
}
直接从全局开始考虑,记录从0开始的cursum累加。记录最小值
情况1:cursum < 0
油不够,不够跑完一圈,返回-1
情况2:min>=0
说明从0开始跑始终够跑完一圈
情况3:min<0
从0开始跑遇到的cursum的最小值是负数,从最后开始向前累加,能够填平这个最小值则说明从那个点开始绕一圈走到最小值处正好可以过这个站点(因为只存在唯一解,所以不存在这个点继续向前扫可以找到更大的正数,如果可以就不是唯一解了)
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int cursum = 0;
int totalsum = 0;
int res = 0;
for(int i = 0;i < gas.length;i++){
int rest = gas[i] - cost[i];
cursum += rest;
totalsum += rest;
if(cursum < 0){
res = i + 1;
cursum = 0;
}
}
//情况1
if(totalsum < 0) return -1;
//情况2
return res;
}
}
从0开始累加,如果遇到cursum < 0,则从0到i这里所有的站点都不可能作为起点通过i,因为0是正数起点,从i+1开始再进行累加,直到条件成立。
这篇博客探讨了一种解决加油站问题的算法,该算法检查给定的油量和费用数组,以确定是否存在一个起点,使得车辆能完成一圈行驶。算法分为三种情况:1) 总油量不足,无法完成循环;2) 从0开始始终足够完成循环;3) 从某个点开始可以填补负值并完成循环。博客详细解释了每种情况的判断逻辑,并提供了两种不同的实现方式。
1546

被折叠的 条评论
为什么被折叠?



