字节跳动在北京有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就行。不过问题不大,思路是一样的。
这是昨天在牛客上看到的一个面经里的题,如果解答有误,看官们直言不讳即可~