(贪心)加油站绕圈问题

  • 题目: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<int> &gas, vector<int> &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<distance; i++){
                costs += gas[i] - cost[i];
                total += gas[i] - cost[i];
                if (costs < 0){
                    index = i;
                    costs = 0;
                }
            }
            if (total < 0)
                return -1;
            else
                return index+1 ;
        }
    };

     

posted @ 2017-01-26 10:13  Kobe10  阅读(1804)  评论(0编辑  收藏  举报