• 第一种想法就是每个位置都遍历一遍 O(n*n)
class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int ans[] = new int[gas.length];
        for (int i = 0; i < ans.length; i++) {
            ans[i] = gas[i] - cost[i];
        }
        for (int i = 0; i < ans.length; i++) {
            int j = 0;
            int temp = 0;
            while (j < ans.length) {
                temp += ans[(i+j)%ans.length];
                if (temp < 0) break;
                j++;
            }
            if(j==ans.length)return i;
        }
        return -1;
    }
}
  • 第二种想法 优化上面的代码 也就是找中断点 然后接着后面查找

    class Solution {
      public int canCompleteCircuit(int[] gas, int[] cost) {
          // 加油站起始点
          int start = 0;
          // 从0-start需要补充多少油 
          int total = 0;
          // 从start开始到i 油量   
          int tank = 0;
    
          for(int i=0; i<gas.length; i++) {
              // 走过ith 加油站还剩下多少油 (>0)
              // 要走ith 加油站差多少油 (<0)
              tank += gas[i] - cost[i];
              // 油不够了,start不能做起始点;
              // 且start ~ i 都不可做起始点。
              if(tank < 0) {
                  start = i+1;
                  total += tank;
                  tank = 0;
              }
          }
          return total+tank >= 0 ?start : -1;
      }
    }