Gas Stations

数组越界

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        //依次从每一个加油站出发
        for (int i = 0; i < gas.size(); i++) {
            int j = i;
            int curgas = gas[j];

            while (curgas >= cost[j]) { //如果当前的汽油量能够到达下一站
                curgas -= cost[j];      //减去本次的消耗

                // 这一行是重点, 我自己的是 j=(i+1)%gas.size(), 混了i,j造成了逻辑混乱
                j = (j + 1) % gas.size(); //到达下一站
                if (j == i) return i;   //如果回到了起始站,那么旅行成功

                curgas += gas[j];       //到下一站后重新加油,继续前进
            }
        }
        return -1;
    }
};

First Try

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        bool goal = false;
        for (int i = 0; i < gas.size(); i++) {
            tank = gas[i];

            //这种逻辑混乱了,j和i混在一起,有两个问题
            //1, cost[(j-1)%n] 当j=0时为-1,错
            //2, 如何跳出错误循环,逻辑设计太复杂
            // 这两个问题被上面的解法用j=i,模拟从i出发,完美解决,在实验第i个的时候应该用一个单独的变量独立测试
            bool run = false;
            if (tank > cost[i]) {
                for (j = (i+1)%gas.size(); j++) {
                    tank = tank - cost[(j-1)%gas.size(); + gas[j];
                    if ( tank < cost[j] ) {
                        run = false;
                        break;
                    }
                }
            }
        }
};

Second Solution

Need Prove

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int sum = 0;
        int total = 0;
        int j = -1;
        for (int i = 0; i < gas.size(); i++) {
            sum += gas[i] - cost[i];
            total += gas[i] - cost[i];
            if(sum < 0) {   //之前的油量不够到达当前加油站
                j = i;
                sum = 0;
            }
        }
        if (total < 0) return -1;    //所有加油站的油量都不够整个路程的消耗
        else return j + 1;
    }
};

results matching ""

    No results matching ""