
1.暴力解法 O(n^2)
class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int length = gas.length;
        //把当前i节点作为起始节点
        for(int i = 0; i < length; i++){
            //模拟一圈
            int index = i; //当前所处的位置
            int remain = 0;
            do{
                remain += (gas[index] - cost[index]);
                if(remain < 0) break; //如果油不足以到达下一个节点跳出此轮模拟
                index = (index+1) % length;
            }while(index != i);
            if(remain >= 0 && index == i) return i;
        }
        return -1;
    }
}
2. 贪心算法 O(N)
讲解视频
class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int total_remain = 0;
        int size = gas.length;
        //有解的必要条件:总获取量>总消耗量
        for(int i = 0; i < size; i++){
            total_remain += gas[i] - cost[i];
        }
        if(total_remain < 0) return -1;
        /**
        结论:从当前位置开始第一次出现邮箱不足的下标处,从开始节点到当
        前节点区间内的所有节点都不能作为开始节点,下一个开始节点可能点是i+1
         */
        int start_index = 0,current_remain = 0;
        for(int i = 0; i < size; i++){
            current_remain += gas[i] - cost[i];
            if(current_remain < 0){
                start_index = i + 1;
                current_remain = 0;
            }
        }
        return start_index;
    }
}
