Java解决加油站问题

Java解决加油站问题

01 题目

  • 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。

    你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。

    给定两个整数数组 gascost ,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。

    示例 1:

    输入: gas = [1,2,3,4,5], cost = [3,4,5,1,2]
    输出: 3
    解释:
    从 3 号加油站(索引为 3 处)出发,可获得 4 升汽油。此时油箱有 = 0 + 4 = 4 升汽油
    开往 4 号加油站,此时油箱有 4 - 1 + 5 = 8 升汽油
    开往 0 号加油站,此时油箱有 8 - 2 + 1 = 7 升汽油
    开往 1 号加油站,此时油箱有 7 - 3 + 2 = 6 升汽油
    开往 2 号加油站,此时油箱有 6 - 4 + 3 = 5 升汽油
    开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。
    因此,3 可为起始索引。
    

    示例 2:

    输入: gas = [2,3,4], cost = [3,4,3]
    输出: -1
    解释:
    你不能从 0 号或 1 号加油站出发,因为没有足够的汽油可以让你行驶到下一个加油站。
    我们从 2 号加油站出发,可以获得 4 升汽油。 此时油箱有 = 0 + 4 = 4 升汽油
    开往 0 号加油站,此时油箱有 4 - 3 + 2 = 3 升汽油
    开往 1 号加油站,此时油箱有 3 - 3 + 3 = 3 升汽油
    你无法返回 2 号加油站,因为返程需要消耗 4 升汽油,但是你的油箱只有 3 升汽油。
    因此,无论怎样,你都不可能绕环路行驶一周。
    

    提示:

    • gas.length == n
    • cost.length == n
    • 1 <= n <= 105
    • 0 <= gas[i], cost[i] <= 104

02 知识点

  • 数组
  • 双重循环

03 我的题解思路

public class canCompleteCircuit1 {

	public static void main(String[] args) {
//		测试数据
		int[] gas= {1,2,3,4,5};
		int[] cost= {3,4,5,1,2};
		System.out.println(canCompleteCircuit(gas, cost));
	}
	public static int canCompleteCircuit(int[] gas, int[] cost) {
		int n=gas.length;//数组长度
		int i=0;//从索引0开始循环
		while(i<n) {
			int gases=0;//当前总油量
			int costs=0;//当前总耗油量
			int j=0;//内部循环值
			while (j<n) {
//				内部循环索引
				int num=(i+j)%n;
//				总量递增
				gases+=gas[num];
				costs+=cost[num];
//				如果总耗油量大于总油量,退出循环
				if(gases<costs) {
					break;
				}
				j++;
			}
//			当内部循环值为n时,说明环路一圈
			if(j==n) {
				return i;
			}else {
//				因为到达第j个加油站前,总油量大于0,所以索引在i到i+j之间的加油站都无法环路
				i=i+j+1;
			}
		}
//		整个循环都不成功则退出循环
		return -1;
		
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宣布无人罪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值