描述
				在一条环路上有 n 个加油站,其中第 i 个加油站有 gas[i] 升油,假设汽车油箱容量无限,从第 i 个加油站驶往第 (i+1)%n 个加油站需要花费 cost[i] 升油。
			
			
				请问能否绕环路行驶一周,如果可以则返回出发的加油站编号,如果不能,则返回 -1。
			
			
				题目数据可以保证最多有一个答案。
			
			
				数据范围: 1 \le n \le 10^4 \1≤n≤104  , gas 和 cost 数组中的值满足 1 \le val \le 10^5 \1≤val≤105 
			
		示例1
				输入: 
			[1,2,3,4,5],[3,4,5,1,2]复制
				返回值: 
			3复制
				说明: 
		只能从下标为 3 的加油站开始完成 (即第四个加油站)
示例2
				输入: 
			[0,10],[9,1]复制
				返回值: 
		1复制
	1、因为题目数据量比较大,暴力解法应该会超时,所以先观察是否有规律可循;
	2、可以看到要能满足题目要求,出发站的汽油gas[i]肯定需要大于从i到i+1需要消耗的汽油,即cost[i],利用这个规律剪枝;
	3、另外要注意对环路的处理,本题中使用cnt统计路过的加油站,确保从某一出发点出发后n个加油站都遍历到
class Solution {
public:
    bool func(vector<int>& gas, vector<int>& cost, int index) {
        int n = gas.size();
        int cnt = 0;
        int sum = 0;
        for (int i = index; cnt < n; i++) {
            sum += (gas[i%n] - cost[i%n]);
            if (sum < 0) return false;
            cnt++;
        }
        return (sum >= 0);
    }
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param gas int整型vector 
     * @param cost int整型vector 
     * @return int整型
     */
    int gasStation(vector<int>& gas, vector<int>& cost) {
        // write code here
        int n = gas.size();
        bool flag = false;
        for (int i = 0; i < n; i++) {
            if (gas[i] < cost[i]) {
                continue;
            }
            flag = func(gas, cost, i);
            if (flag) return i;
        }
        return -1;
    }
};

 京公网安备 11010502036488号
京公网安备 11010502036488号