zoukankan      html  css  js  c++  java
  • (贪心)加油站绕圈问题

    • 题目: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 ;
          }
      };
  • 相关阅读:
    电商交易背景知识合集第二季
    技术高手如何炼成
    #研发解决方案#基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案
    电商交易背景知识合集第一季
    真刀真枪压测:基于TCPCopy的仿真压测方案
    安全基础教育第二季第1集:屡战屡败的找回密码
    #研发解决方案#从宏观到微观——天机与鹰眼联手
    挖坑和踩雷
    我们过去几年做对了哪些事
    小伙伴们手滑集
  • 原文地址:https://www.cnblogs.com/Kobe10/p/6351310.html
Copyright © 2011-2022 走看看