134. 加油站

116 篇文章 0 订阅

问题

在这里插入图片描述

例子
在这里插入图片描述
在这里插入图片描述

思路
在这里插入图片描述

  • 方法1

  • 方法2

代码

//方法0:更容易
class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
    	//找到从下标0开始,最缺油的地方,然后return 该下标+1
        int min_index=-1;
        int min = Integer.MAX_VALUE;;
        int now=0;
        for(int i=0; i<gas.length; i++) {
            now+=gas[i]-cost[i];
            if(now<min) {
                min=now;
                min_index=i;
            }
        }
        
        //如果油量<耗油,返回-1
        return now<0?-1:(min_index+1)%gas.length;
    }
}
//方法1
class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        //rest为从下标0到i剩余油量,run为从起点到i剩余油量
        int rest=0,run=0,start=0;
        for(int i=0; i<gas.length; i++) {
            run += gas[i]-cost[i];
            rest+= gas[i]-cost[i];
            //油不够从i->i+1,0->i站剩余油量都是>=0,每减少一站,就少了一些剩余油量。所以如果从i前的站点作为起始站,剩余油量不可能冲过i+1站
            if(run<0) {
                
                start = i+1;
                run = 0;
            }
        }
        //start最大为len-1,start值从0开始验证的,不可能len-1之后,再去验证0下标
        return rest<0?-1:start;
//我自己的
class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int sum_gas=0,sum_cost=0;
        for(int i=0; i<gas.length; i++) {
            sum_gas += gas[i];
            sum_cost+= cost[i];
            gas[i] = gas[i]-cost[i];
        }
        if(sum_cost>sum_gas) return -1;
 
        for(int i=0; i<gas.length; i++) {
            if(gas[i]>=0){//>=0即可,=0时正好
                if(get(gas,i)==true) return i;
            }
        }   
        return -1;
    }
    public boolean get(int[] gas, int i) {
        int res=0;
        
        for(int j=i; j<gas.length; j++) {
            res += gas[j];
            
            if(res<0) return false;
        }
        for(int j=0; j<i; j++) {
            res += gas[j];
            
            if(res<0) return false;
        }
        return true;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值