今天也是记录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;
}