leetcode [134]Gas Station

本文详细解析了环路加油站问题,给出了两种Java实现方案。问题要求找到能够绕环路一圈的起点加油站,若无法完成则返回-1。通过计算每个加油站的油量与消耗差值,确定可能的起点。

There are N gas stations along a circular route, where the amount of gas at station i is gas[i].

You have a car with an unlimited gas tank and it costs cost[i] of gas to travel from station i to its next station (i+1). You begin the journey with an empty tank at one of the gas stations.

Return the starting gas station's index if you can travel around the circuit once in the clockwise direction, otherwise return -1.

Note:

  • If there exists a solution, it is guaranteed to be unique.
  • Both input arrays are non-empty and have the same length.
  • Each element in the input arrays is a non-negative integer.

Example 1:

Input: 
gas  = [1,2,3,4,5]
cost = [3,4,5,1,2]

Output: 3

Explanation:
Start at station 3 (index 3) and fill up with 4 unit of gas. Your tank = 0 + 4 = 4
Travel to station 4. Your tank = 4 - 1 + 5 = 8
Travel to station 0. Your tank = 8 - 2 + 1 = 7
Travel to station 1. Your tank = 7 - 3 + 2 = 6
Travel to station 2. Your tank = 6 - 4 + 3 = 5
Travel to station 3. The cost is 5. Your gas is just enough to travel back to station 3.
Therefore, return 3 as the starting index.

Example 2:

Input: 
gas  = [2,3,4]
cost = [3,4,3]

Output: -1

Explanation:
You can't start at station 0 or 1, as there is not enough gas to travel to the next station.
Let's start at station 2 and fill up with 4 unit of gas. Your tank = 0 + 4 = 4
Travel to station 0. Your tank = 4 - 3 + 2 = 3
Travel to station 1. Your tank = 3 - 3 + 3 = 3
You cannot travel back to station 2, as it requires 4 unit of gas but you only have 3.
Therefore, you can't travel around the circuit once no matter where you start.

题目大意:

一个环路有n个加油站,gas给出每一站能加多少油,cost给出该站到下一站会花费多少油。

解法:

使用tmp存储每一站gas-cost的值,可知当tmp[i]小于0的时候,车不能从这一站出发,因为油不够出发的。

1.首先判断所有tmp的和是否是大于等于0的,如果是,则说明存在解,否则不存在解。

2.再寻找出发的位置,如果说当前位置的tmp[start]<0,则不能从start出发,要找到满足tmp[start]>=0的start

3.sum记录当前剩余油的总量,如果说sum<0,那么start要从end的下一个出发

java:

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int []tmp=new int[gas.length];
        for(int i=0;i<gas.length;i++){
            tmp[i]=gas[i]-cost[i];
        }
        int sum=0;
        for(int i=0;i<gas.length;i++) sum+=tmp[i];
        if(sum<0) return -1;
        sum=0;
        int start=0,end=0;
        while(start<gas.length){
            if(tmp[start]<0) {start++;end=start;}
            sum+=tmp[end];
            if((end+1)%gas.length==start) break;
            if(sum<0) {
                start=end+1;
                sum=0;
            }
            end=(end+1)%gas.length;
        }

        return start;
    }
}

因为题目所给要求是结果如果存在解,一定是唯一解,所以可以改进成下面。

java:

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int all=0,tmpSum=0;
        int start=0,n= gas.length,i=0;
        while (i<n){
            all+=gas[i]-cost[i];
            tmpSum+=gas[i]-cost[i];
            if(tmpSum<0) {
                start=i+1;
                tmpSum=0;
            }
            i++;
        }
        if(all<0) return -1;

        return start;
    }
}

转载于:https://www.cnblogs.com/xiaobaituyun/p/10726049.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值