(貪心)加油站繞圈問題


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

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM