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加满了。。。跳槽、跳槽!
本文含有隐藏内容,请 开通VIP 后查看