奕辰杰的博客

java程序猿一枚,分享自己的技术和职业经验。

算法题:加油站
算法题:加油站
在一条环路上有 N 个加油站,其中第 i 个加油站有汽油gas[ i ],并且从第 i 个加油站前往第 i+1 个加油站需要消耗汽油cost[ i ]。

你有一辆油箱容量无限大的汽车,现在要从某一个加油站出发绕环路一周,一开始油箱为空。

写一个函数求可环绕环路一周时出发的加油站的编号,若不存在环绕一周的方案,则返回-1。

注意事项:
1、数据保证答案唯一。
2、O(n)时间和O(1)额外空间

格式:

输入行依次输入一个表示每个加油站的汽油的容量的数组 gas 和一个表示加油站之间耗油量的数组 cost ,最后输出可环绕一周的加油站的编号,如果不存在则返回 -1。

样例输入

gas = [ 1,1,3,1 ]
cost = [ 2,2,1,1 ]

样例输出

2  


java版本的代码实现:

package cn.cat.algorithm;


public class GasStation {
	/**
	 * 分析: 此题主要难点是在于O(n)时间复杂度的要求,只能做一次循环。
	 * 		如果是使用枚举法,将每个油站都循环尝试一次,那么O(n)时间复杂度是无法完成的,
	 *      此处只能使用贪婪算法,如果当前油站的所剩油到下一个油站所消耗的汽油称为油耗差,
	 *      那么设定最先符合油耗差大于0的油站为油站起点,只有当后面有出现油耗差小于0时,
	 *      又重新寻找最先符合油耗差大于0的油站。
	 * 
	 * @Description: 
	 * @author gwj
	 * @Created 2018年4月17日 上午10:03:26 
	 * @param args
	 */
	public static void main(String[] args) {
		int[] gas = new int[]{1, 1, 3, 1};
		int[] cost = new int[]{2, 2, 1, 1};
		
		int remainGas = 0;
		int startIndex = -1;
		for (int i = 0; i < gas.length; i++) {
			remainGas += gas[i] - cost[i];
			if (remainGas >= 0) {
				if (startIndex == -1) {
					startIndex = i;
				}
			} else {
				startIndex = -1;
			}
		}
		
		//无法环绕一周
		if (remainGas < 0) {
			System.out.println(-1);
		} else {
			System.err.println(startIndex);
		}
		
		
	}
}

阅读更多
版权声明:本文为博主原创文章,如需转载,必须在转载处声明原作者,已经加入博客原链接地址。 https://blog.csdn.net/u013777382/article/details/79973915
个人分类: 编程算法
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

算法题:加油站

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭