循环数组——gas station

题目描述

      N个加油站呈环形分布,第i个加油站的油量为gas[i],你有一辆可以装无限油量的卡车,并且从加油站i到加油站i+1的途中需要消耗掉cost[i]的油量。油箱为空的条件下选择一个加油站起步并能够转一圈重新回到起点。

若不存在这样的加油站返回-1,否则返回该加油站的下标。


该题求线性的解法


方法一:最直观的解法为O(N^2)时间复杂度,挨个加油站尝试。


需要注意的是循环数组循环下标的转换。

public class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {  
        for(int i=0;i<gas.length;i++)
            {
             int count=0;
            for(int j=i;j<gas.length+i;j++)
                {
                //循环数组循环时下标的转换
                count+=gas[j%gas.length]-cost[j%gas.length];
                if(count<0)
                   break;
            }
            if(count>=0)
                return i;
        }
        return -1;
    }
}

方法二:在方法一的基础上提升了时间性能

 public int canCompleteCircuit(int[] gas, int[] cost) {
        for(int i=0;i<gas.length;i++)
            {
            gas[i]-=cost[i];
        }
        for(int i=0;i<gas.length;i++)
            {
            if(gas[i] < 0)
                continue;
            int count =0;
            for(int j=i;j<i+gas.length;j++)
                {
                count+=gas[j%gas.length];
                if(count < 0)
                    break;
            }
            if(count >= 0)
            return i;
        }
        return -1;
    }

方法三:

http://www.cnblogs.com/felixfang/p/3814463.html

这种解法其实依托于一个数学命题:

对于一个循环数组,如果这个数组整体和 SUM >= 0,那么必然可以在数组中找到这么一个元素:从这个数组元素出发,绕数组一圈,能保证累加和一直是处于非负状态。

public int canCompleteCircuit(int[] gas, int[] cost) {
        int total=0;
        int start=0;
        int cursum=0;
        for(int i=0;i<gas.length;i++)
            {
            total+=gas[i]-cost[i];
            if(cursum<0)
                {
                cursum=gas[i]-cost[i];
                start=i;
            }
            else
                cursum+=gas[i]-cost[i];
        }
        return total<0?-1:start;
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值