【数据结构与算法】字节面试算法题

字节跳动在北京有N个工区

题目描述:

第一题. 字节跳动在北京有N个工区,形成一个环状,Bytebus是往返在各个工区的通勤车,按工区的顺序行驶,其中第 i 个工区有汽油 gas[i] 升。你有一辆油箱容量无限的的Bytebus,从第 i 个工区开往第 i+1 个工区需要消耗汽油 cost[i] 升。你从其中的一个工区出发,开始时油箱为空。如果你可以绕环路行驶一周,则返回出发时工区的编号,否则返回 -1。

示例:

输入:
gas = [1,2,3,4,5]
cost = [3,4,5,1,2]
输出:
3

思想:

我也不知道这算什么思想,具体看下面注释吧。时间复杂度O(n)。

代码:

static int staNum(int[] gas, int[] cost) {
    int len = gas.length;
    int nowLeft=0;
    int preCost=0,flag=0;//flag标记起点下标
    for(int i=0;i<len;++i){
        nowLeft+= gas[i] - cost[(i+1+len)%len];
        if(nowLeft<0){//此时油量为负数
            preCost+=nowLeft;//累计负的油量
            nowLeft=0;//清零重新开始
            flag=i+1;//表示将下一个工区作为起点
        }
    }
    if(nowLeft+preCost<0){//总剩余油量为负数返回-1
        return -1;
    }
    return flag+1;
}

另外,我昨天跟同学讨论了下,感觉题目关于 i 的理解有点歧义,比如,从 gas[0] 到 gas[1] 需要耗费的油量是 cost[0] 还是 cost[1] 啊,上面的代码是按照 cost[1] 来的。如果是 cost[0] 的话,就更直白了,把代码中的 cost[(i+1+len)%len] 换成cost[i],最后return flag就行。不过问题不大,思路是一样的。

这是昨天在牛客上看到的一个面经里的题,如果解答有误,看官们直言不讳即可~

猜你喜欢

转载自www.cnblogs.com/buptleida/p/12672490.html
今日推荐