【每日一道算法题】Leetcode之gas-station 加油站问题 Java

134.加油站 leetcode
题目描述:
环形路上有n个加油站,第i个加油站的汽油量是gas[i].
你有一辆车,车的油箱可以无限装汽油。从加油站i走到下一个加油站(i+1)花费的油量是cost[i],你从一个加油站出发,刚开始的时候油箱里面没有汽油。
求从哪个加油站出发可以在环形路上走一圈。返回加油站的下标,如果没有答案的话返回-1。
注意:答案保证唯一。
(1)例1
输入:int[] gas={4,5,2,6,5,3};int[] cost={3,2,7,3,2,9}; 输出:3
(2)例2
输入:{4} {5} 输出:-1

public class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
	        int start=0;//开始加油的位置
	        int leave=0;//剩余油量
	        for(int i=0;i<gas.length;i++){
	            leave=leave+gas[i]-cost[i];
	            if(leave<0){//如果小于0,从下一个加油站开始
	                start=i+1;
	                leave=0;
	            }
	        }
	        //计算开头到start之间是否可以到达
	        for(int i=0;i<start;i++){
	        	leave=leave+gas[i]-cost[i];
	        	if (leave<0) {
					return -1;
				}
	        }
	        if(leave>=0) return start;
	        else return -1;
    }
}

解题思路:贪心算法。
分为两个部分。第一个部分计算start的位置;第二个部分计算剩余的路程是否可以回到start。
【每日一道算法题】Leetcode之gas-station 加油站问题 Java_第1张图片
第一部分:
如上图,从a出发,leave表示剩余油量。计算leave=leave+gas[a]-cost[0],如果leave大于0则继续计算leave=leave+gas[b]-cost[1];如果leave小于0,则leave归0,start设置为i+1。
为什么leave小于0,start和i之间就不会有可以存在的起始点了?
假设start=a,走到d的时候leave<0,那就是gas[a]-cost[0]+gas[b]-cost[1]+gas[c]-cost[2]<0,由于每次都要判断leave是否小于0,所以gas[a]-cost[0]+gas[b]-cost[1]一定大于0,gas[c]-cost[2]是负数,且Math.abs(gas[c]-cost[2])>Math.abs(gas[a]-cost[0]+gas[b]-cost[1]),所以从b出发,从c出发都不满足要求。
第二部分:
假设,start=c,走到数组的结束位置是d,此时leave=…+gas[d]-cost[3],但是不知道此时的leave能不能满足a到c之间的路程,因此循环判断。

你可能感兴趣的:(【每日一道算法题】Leetcode之gas-station 加油站问题 Java)