欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

134. 加油站

程序员文章站 2024-03-09 14:10:47
...

问题

134. 加油站

例子
134. 加油站
134. 加油站

思路
134. 加油站

  • 方法1

  • 方法2

代码

//方法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;
    }
}
相关标签: leetcode medium