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;
    }

 

posted on 2021-07-16 16:46  一仟零一夜丶  阅读(38)  评论(0)    收藏  举报