letcode每日一题--加油站

今天也是记录Letcode刷题的美好一天,要在防止自己变笨的路上继续加油,冲鸭!!!

题目描述如下:


我能想到的就是暴力破解,从第一个开始,逐个去试,如果要是结余油量为负数就直接进行下一个,代码如下:

public int canCompleteCircuit(int[] gas, int[] cost) {
        for(int i=0;i<gas.length;i++){
            int prev=0;
            for(int j=i;j<i+gas.length;j++){
                int realIndex=j%gas.length;
                prev+=gas[realIndex]-cost[realIndex];
                if(prev<0){
                    break;
                }
            }
            if(prev>=0){
                return i;
            }
        }
        return -1;
    }

官方提供的题解大致与我的这个是相同的,但是看到有网友大神提供的利用折线图来解,时间复杂度 O(N),空间复杂度 O(1),所以还是果断学习一下吧!




自己去画一画,会发现,改变出发点时整体折线图的形状是没有变的,改变的是y值,相当于将折线图在Y轴方向上上下平移。那么,当最小点落在X轴上时(也就是使得最小点y=0时),整体折线在X轴上方,y值恒大于等于0,也就是剩余油量一直不为负,可以绕行一圈。代码实现如下:

public int canCompleteCircuit(int[] gas, int[] cost) {
        int minSpare=Integer.MAX_VALUE;
        int prev=0;
        int index=0;
        for(int i=0;i<gas.length;i++){
            prev+=gas[i]-cost[i];
            if(prev<minSpare){
                minSpare=prev;
                index=i;
            }
        }
        return prev<0?-1:(index+1)%gas.length;
    }
posted @ 2020-11-18 10:34  CodeWangHAHA  阅读(107)  评论(0编辑  收藏  举报