- 题目:https://www.nowcoder.com/practice/3b1abd8ba2e54452b6e18b31780b3635?tpId=46&tqId=29046&tPage=3&rp=3&ru=/ta/leetcode&qru=/ta/leetcode/question-ranking
- 翻译一下题目:题目的意思是开一辆加油车,绕着多个加油站走一圈,最终回到原点。每个加油站的加油量gas[i],到达下一个加油站花费的油量cost[i],从这些环形的加油站中找到一个加油站的位置能够绕一圈。假定只有一个位置符合题目要求。如果不存在就返回-1;
- 思路:这个问题我们可以想到有两个问题需要解决。
- ①:是否可以绕所有加油站一圈,也就是是否存在这么一个起始位置。这个问题只要一个循环就能解决。计算总共油量的差值即可 total+=gas[i] - cost[i];
- ②:找到那个符合要求的起始位置。这个问题我们可以利用贪心算法。设置一个存储变量costs。随机的从第一个位置出发,sum +=gas[i] - cost[i];当找到某个位置sum<0,表示前面的所有加油站都是不符合要求的,将sum置为0,从当前位置继续查找,待一次循环结束之后,位置便找到了。
- 代码
class Solution {public: int canCompleteCircuit(vector &gas, vector &cost) { //这个题目有两个问题需要解决 //①:加油车是否能够走完一圈:一次循环把花费的汽油和加入的汽油进行加减,如果大于0可以,否则不可以。 //②:在哪个位置起始能够走完一圈:对每一个加油站设置一个变量diff,cost(路上总共花费的)-gas(已经有的) = diff。如果每个站点的diff都是 //costs表示每一个经过每个加油站剩余的油,当油不足以到达下一个加油站的时候,从当前加油站重新计算。前面的加油站都不符合要求 //total表示总共的经过所有加油站剩余的油 int costs = 0; int index = -1; int total = 0; int distance = gas.size(); for (int i=0; i