面试经典150题(14)

leetcode 150道题 计划花两个月时候刷完,今天(第五天)完成了1道(14)150:
14. (134. 加油站)题目描述:

在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
给定两个整数数组 gas 和 cost ,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。

第一版(暴力求解,超时了,好难啊,想不到题解里面的想法。。垃圾暴力求解我就不放这了,放一下吧暴力求解也写了好一会。。。)

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int gasAmount=0;
        int costAmount=0;
        int len=gas.length;
        int[] amount=new int[len];
        for(int i=0;i<len;i++){
            gasAmount+=gas[i];
            costAmount+=cost[i];
            amount[i]=gas[i]-cost[i];
        }
        if(gasAmount<costAmount){
            return -1;
        }
        for(int i=0;i<len;i++){
            if(amount[i]>=0){
                int res=canGo(amount,i);
                if(res!=-1)
                    return i;
            }
        }
        return -1;   
    }
    public int canGo(int[] amount, int index){
        int len=amount.length;
        int temp=index;
        int sum=amount[temp++];
        temp=temp%len;
        while(temp!=index){
            if(sum<0){
                return -1;
            }
            sum+=amount[temp++];
            temp=temp%len;
        }
        return index;
    }
}

第二版(看的题解,说实话官方给的题解是真的看不懂 还得是评论区的通俗易懂,总结就是,找gas[i]-cost[i] 和的最小值,然后最小值的下一个就是答案,一脸懵逼的我)

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int gasAmount=0;
        int costAmount=0;
        int len=gas.length;
        int[] amount=new int[len];
        for(int i=0;i<len;i++){
            gasAmount+=gas[i];
            costAmount+=cost[i];
            if(i==0)
                amount[i]=gas[i]-cost[i];
            else{
                amount[i]=amount[i-1]+gas[i]-cost[i];
            }
        }
        if(gasAmount<costAmount){
            return -1;
        }
        // 找最小的
        int minValue=Integer.MAX_VALUE;
        int minIndex=-1;
        for(int i=0;i<len;i++){
            if(amount[i]<minValue){
                minValue=amount[i];
                minIndex=i;
            }
        }
        // 这个说是与一个案例有 bug 所以要加上这一句。。
        if(minValue>=0)  return 0;
        return (minIndex+1)%len;
    }
}

早日跳槽,明天好好刷,今天周一加上周日失眠了,各种debuff加满了。。。跳槽、跳槽!

你可能感兴趣的:(面试经典,150,题,面试,算法,职场和发展)