LeetCode题目:134. 加油站

题目

题目链接: https://leetcode-cn.com/problems/gas-station/
题目解析:问在何处出发时,可以环绕一周。
第一种方法:暴力解法(两次循环):直接看代码
在这里插入图片描述
第二种方法:
直接将每段路车最终能剩下的油算出来,如果加起来大于等于0则这段路就可以走的通,如果小于0则走不通
解决了走不走得通的问题,那就开始找,从哪里开始走。
如果A到不了B,那就从下一个加油站开始,遍历一遍数组找到一个可以走的地点。
在这里插入图片描述
在这里插入图片描述

代码

第一种:

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
    //循环遍历
        	for(int i=0;i<gas.length;i++) {
        	//如果给的油比需要的油还要少,说明到达不了,如果多或者刚好则可以继续跑下去
			if(gas[i]>=cost[i]) {
				//记录跑过的加油站
				int length=0;
				//记录第几个加油站
				int j=i;
                if(i==gas.length-1)
                    j=0;
                else
                    j+=1;
                //g车里的油
				int g=gas[i];
				//c则是需要的油
				int c=cost[i];
				//循环遍历
				while(length<gas.length) {
					//先减去途中的油
					g-=c;
					//如果车里的油大于等于0则说明可以到达
					if(g>=0) {
						//如果所有加油站都跑完了,就返回最初的加油站
						if(length==gas.length-1)
							return i;
						//车库里加油
						g+=gas[j];
						//更改需要消耗的油
						c=cost[j];
						//如果是最末尾的加油站,则改变j,开始循环
						if(j==gas.length-1)
							j=0;
						else
							j++;
						length++;
					}else
						break;
				}
			}
		}
		return -1;
    }
}

第二种:

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
    	//从开始点车里的油
		int need = 0;
		//从哪里开始
		int start = 0;
		//总共下来车里还剩多少油
		int total = 0;
		//循环遍历
		for(int i = 0;i<gas.length;i++) {
			//开始车里计算油
			need = need + gas[i]-cost[i];
			//加上这段路程车里剩的油
			total += (gas[i]-cost[i]);
			//如果车里油为负数,则走不到
			if(need<0) {
				//开始计算从下一个加油站出发
				start = i+1;
				need = 0;
			}
				
		}
		//如果这段路可以走的下来,就返回初始加油站
		if(total>=0)
			return start;
		else
			return -1;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41816516/article/details/106857982