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)); } }
时间: 2024-10-29 19:11:42