
目录
1. 解题思路
参考答案解题思路:
解决此题需要知道:从 x 出发 经过 z加油站最远到达 y 加油站,则从 z加油站出发一定不能到 y+1 的加油站:因为 从x 出发到 z ,其汽车中的余量一定 >= 0 的;若从 x 到 z 还有余量才到达 y 所以其一定不能到达 y+1 处。这就更别提 从 x 到 z 还有余量为 0 啦。
所以我们此时有两种解法:
1.只需要判断当前结点所能到达的最远值,若最后到达的最远值的位置与 其 起始地址一样,则返回答案,否则就判断该结点能到达的最远位置的下一个结点即可。即可判断从某节点遍历经过的结点个数即可,若中间经过的结点个数==n,则说明可以遍历一周,否则更换起始点位置。
2.只要总油量大于等于总耗油量就肯定能跑完一圈,换句话说,油的剩余量如果大于等于0就肯定能跑完一圈,这么一想这个问题就简单了,那么总耗油量如果小于0,直接返回-1
2. CODE
1. 解法一:遍历结点个数确定
int n=gas.size();
int curnum=0; //当前剩余量
int totalnum=0; // 总的剩余量耗油量
int idx=0;
for(int i=0;i<n;i++){
curnum+=gas[i]-cost[i];//用于存储 从 起始点 开始的到达 i 时剩余油量,若小于 0 则更换起始站
totalnum+=gas[i]-cost[i];
if(curnum<0){//说明当前到达不了此站,需要重新选定起始站
idx=(i+1)%n;
curnum=0;
}
}
if(totalnum<0) return -1;
return idx;
2. 解法二:剩余油量进行判断
int cnt=0;//存储中间经过的结点个数
for(int i=0;i<n;i++){
cnt=0;
int sumgas=0;
int sumcost=0;
while(cnt<n)//判断从i开始其查找的结点个数,若是最后cnt==n,说明其可以循环一周
{
j=(i+cnt)%n;// 以j为起始结点,然后遍历一周,其所有的gas是否大于或等于 cost,最后
sumgas+=gas[j];
sumcost+=cost[j];
if (sumcost>sumgas) {
break;
}
cnt++;
}
if(cnt==n)
return i;
i=i+cnt;
}
return -1;
博客围绕LeetCode算法题展开,介绍两种C++解法。一是遍历结点个数确定,判断当前结点能到达的最远值,若经过结点数等于n则可遍历一周;二是根据剩余油量判断,若总油量大于等于总耗油量,即油剩余量大于等于0就能跑完一圈,总耗油量小于0则返回 -1。
873

被折叠的 条评论
为什么被折叠?



