7、C++算法之代码随想录(贪心算法)——加油站
·
1.问题
在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
给定两个整数数组 gas 和 cost ,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。
2.思路
使用贪心算法进行求解,主要分为三种情况,
-
情况一:如果gas的总和小于cost总和,那么无论从哪里出发,一定是跑不了一圈的
-
情况二:rest[i] = gas[i]-cost[i]为一天剩下的油,i从0开始计算累加到最后一站,如果累加没有出现负数,说明从0出发,油就没有断过,那么0就是起点。
-
情况三:如果累加的最小值是负数,汽车就要从非0节点出发,从后向前,看哪个节点能把这个负数填平,能把这个负数填平的节点就是出发节点。
3.代码实现
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int curSum = 0;
int min = INT_MAX;
for(int i=0;i<gas.size();i++){
curSum+=gas[i]-cost[i];
if(min>curSum){
min = curSum;
}
}
if(curSum<0) return -1;
if(min>=0) return 0;
for(int i=gas.size()-1;i>=0;i--){
int rest = gas[i]-cost[i];
min+=rest;
if(min>=0){
return i;
}
}
return -1;
}
更多推荐



所有评论(0)