Leetcode 134. 加油站(中等) 贪心算法
题目:
思路:
就是每到达一个站点i
,可以加gas[i]
升油,但离开站点i
需要消耗cost[i]
升油,问你从哪个站点出发,可以兜一圈回来
汽车进入站点i
可以加gas[i]
的油,离开站点会损耗cost[i]
的油,那么可以把站点和与其相连的路看做一个整体,将gas[i] - cost[i]
作为经过站点i
的油量变化值:
有了这个环形数组,我们需要判断这个环形数组中是否能够找到一个起点start
,使得从这个起点开始的累加和一直大于等于 0。
如果把这个「最低点」作为起点,就是说将这个点作为坐标轴原点,就相当于把图像「最大限度」向上平移了。
class Solution { public: int canCompleteCircuit(vector<int>& gas, vector<int>& cost) { int n=gas.size(); //记录累计的剩余油量 int sum=0; //记录起点 int start=0; //记录剩余油量的最小值 int minSum=0; for(int i=0;i<n;++i){ sum+=gas[i]-cost[i]; //如果剩余油量小于最小值,更新起点跟最小值 //目的是找出累计油量最小的位置,并将起点更新至i+1 //这样保证可以到达最低点 // 经过第 i 个站点后,使 sum 到达新低 // 所以站点 i + 1 就是最低点(起点) if(sum<minSum){ start=i+1; minSum=sum; } } //如果总剩余小于0,意味着不能走完 if(sum<0) return -1; //由于有环,start==n也就是0 return start==n?0:start; } };
联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=