(LeetCode 面试经典 150 题 ) 134. 加油站 (贪心)
题目:134. 加油站
思路:贪心,时间复杂度0(n)。
当前点i来到下一个点i+1,那么油的变化量是gas[i]-cost[i]。
先统计遍历完所有点后,油的变化量sum。如果sum<0,说明不可能绕行一周;sum>0,说明可以,当sum在最低点id时,那么后续的gas[i]-cost[i]增量和>=0,即id+1为合法点。
C++版本:
class Solution {
public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int n=gas.size();// sum为油的变化量之和,mn为sum最小时的值int sum=0,mn=0;// id为mn时的下标int idx=0;for(int i=0;i<n;i++){sum+=gas[i]-cost[i];// 维护最小值if(sum<mn){mn=sum;idx=i+1;}}if(sum<0) return -1;return idx%n;}
};
JAVA版本:
class Solution {public int canCompleteCircuit(int[] gas, int[] cost) {int n=gas.length;int sum=0,mn=0;int idx=0;for(int i=0;i<n;i++){sum+=gas[i]-cost[i];if(sum<mn){mn=sum;idx=i+1;}}if(sum<0) return -1;return idx%n;}
}
Go版本:
func canCompleteCircuit(gas []int, cost []int) int {n:=len(gas)sum,mn,id:=0,0,0for i:=0;i<n;i++ {sum+=gas[i]-cost[i]if sum<mn {mn=sum;id=i+1}}if sum<0 {return -1}return id
}