An kind of interesting problem. Use an array arr[] to store how many gas are left if we travel from station i to station i+1, arr[i] = gas[i] - cost[i]. Then it becomes an variance of the maximal sub array problem: if the sum of the sub array arr[i....j] < 0, it means we can't start at any gas station whose index is within [i..j]. Then we should skip to j+1 and start to scan again. O(n) time and O(n) space:
public class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int[] arr = new int[gas.length];
int sum = 0;
for(int i=0;i<gas.length;i++)
{
arr[i] = gas[i] - cost[i];
sum+=arr[i];
}
if(sum < 0) return -1;
int s;
boolean flag;
for(int i=0;i<gas.length;i++){
if(arr[i] < 0)
continue;
flag = true;
s=0;
for(int j=0;j<gas.length;j++)
{
int ind = (i+j) % gas.length;
s += arr[ind];
if(s<0)
{
i = i + j;
flag = false;
break;
}
}
if(flag == true)
return i;
}
return -1;
}
public static void main(String[] args)
{
int[] gas= new int[]{1,2,3,3};
int[] cost = new int[]{2,1,5,1};
Solution sol = new Solution();
System.out.print(sol.canCompleteCircuit(gas, cost));
}
}