(贪心)加油站绕圈问题

  • 题目: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 ;
        }
    };

     

转载于:https://www.cnblogs.com/Kobe10/p/6351310.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值