题目来源:
134.加油站 - 力扣(LeetCode)
思路:
参考学习了两个思路的解法:
(1)官方题解:在我看到第二种就是(2)用图的思想分析时,我觉得官方和大佬的想法在本质上不谋而合,共同点且核心都是利用油量的变化,只不过官方题解使用了两个变量——总油量和当前油量进行比较判断,微观上用当前油量判断,如果行驶到下一个加油站当前油量小于0,说明排除从这个加油站开始环绕一周的可能,ans=i+1;宏观上用总油量判断,如果行驶一周后总油量小于0,说明无法成功环绕一周。代码运行时间相比(2)较长。
(2)不多说了,这位大佬给的题解思路很清晰,直接点进链接看就好。(个人收藏分享向)
AC代码:(代码语言C++)
(1)第一种思路
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int len=gas.size();
int total=0,curr=0,ans=0;
for(int i=0;i<len;i++)
{
total+=gas[i]-cost[i];
curr+=gas[i]-cost[i];
if(curr<0)
{
ans=i+1;
curr=0;
}
}
if(total>=0)
return ans;
else
return -1;
}
};
(2)第二种思路
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
// int len=gas.size();
// int total=0,curr=0,ans=0;
// for(int i=0;i<len;i++)
// {
// total+=gas[i]-cost[i];
// curr+=gas[i]-cost[i];
// if(curr<0)
// {
// ans=i+1;
// curr=0;
// }
// }
// if(total>=0)
// return ans;
// else
// return -1;
int len=gas.size();
int total=0;
int minn=INT_MAX;
int ans=0;
for (int i=0;i<len;i++)
{
total+=gas[i]-cost[i];
if (total<minn)
{
minn=total;
ans=i;
}
}
return total<0?-1:(ans+1)%len;
}
};