题目描述
原题链接:134. 加油站
解题思路
本题可从区间与0的大小关系入手,若存在可以跑一圈的位置,此时所有gas[i] - cost[i]
的和一定是大于等于0的,若小于0,则不会有可以跑一圈的位置。而有效的起始位置,一定是从此位置以后,可保证整体区间大于等于0。
局部最优解: 依次累加形成区间,所有累加后,区间大于等于0时,则有解
全局最优解: 找到可以跑一圈的起始位置
设置两个变量curSum
用于记录从某一起始位置出发后,区间的累加和。totalSum
用于记录整个区间的累加和。
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int curSum = 0, totalSum = 0, target = 0;
for(int i = 0; i < gas.size(); i++) {
curSum += gas[i] - cost[i];
totalSum += gas[i] - cost[i];
if(curSum < 0) { // 起始点一定会让之后的区间累加和大于等于0,当前区间内加到0,更新起始点
target = i + 1; // 若totalSum>0时,一定不会出现curSum加到最后一个数变为小于0,若加上后小于0,则totalSum一定小于0
curSum = 0;
}
}
// 整体累加小于0时,一定找到不到
if(totalSum < 0) return -1;
return target;
}
};
参考文章:134. 加油站