134. 加油站
package leetcode; public class demo_134 { public int canCompleteCircuit(int[] gas, int[] cost) { //如果gas数组小于cost肯定不会通过 if(sumArray(gas)<sumArray(cost)) {return -1;} //记录开始的位置 int start; for(start=0;start<gas.length;start++) { //走过了几个加油站 int count=0; //当前油箱的油量 int oil=0; //当前所在加油站的位置 int location=start; while(count<=gas.length) { //当前油箱和加油站的油量总和足够到下一站 if(oil+gas[location]>=cost[location]) { //改变油箱的油量 oil=oil+gas[location]-cost[location]; //记录下一个位置 location=(location+1)%gas.length; count=count+1; } else { break; } } if(count>gas.length) { System.out.println(start); return start; } } return -1; } //计算一个数组的总和 public int sumArray(int[] num) { int sum=0; for(int n:num) { sum=sum+n; } return sum; } public static void main(String[] args) { // TODO Auto-generated method stub demo_134 d134=new demo_134(); int[] gas= {1,2,3,4,5}; int[] cost= {3,4,5,1,2}; d134.canCompleteCircuit(gas, cost); } }
简便算法
public int canCompleteCircuit(int[] gas, int[] cost) { int rest=0; int run=0; int start=0; for(int i=0;i<gas.length;i++) { run=run+(gas[i]-cost[i]); //油箱剩余油量 rest=rest+(gas[i]-cost[i]); //如果到不了当前的位置,其实点就从下一个位置开始 if(run<0) { start=i+1; run=0; } } return rest<0?-1:start; }
浙公网安备 33010602011771号