【LeetCode】134. 加油站

思路

暴力法

暴力破解,一方面验证自己对题目的理解是否正确,另一方面后续的优化也可以从这里入手。
1、考虑从第0个点出发,能否回到第0个点。
2、考虑从第1个点出发,能否回到第1个点。
3、考虑从第2个点出发,能否回到第2个点。
… …
4、考虑从第n个点出发,能否回到第n个点。

代码
//暴力法
class Solution {
public:
	int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
		int n = gas.size();
		//考虑从每一个点出发
		for (int i=0;i<n;i++){
			int j = i;
			int remain = gas[i];
			//当前剩余的油能否到达下一个点
			while (remain-cost[j]>=0){
				//减去花费的加上新的点的补给
				remain = remain - cost[j] + gas[(j + 1) % n];
				j = (j + 1) % n;
				//如果j回到了i
				if (j == i) {
					return i;
				}
			}
		}
		return -1;
	}
};
贪心法

说实话这个在LeetCode上看了很久的题解,但还是对于官方题解不是很懂,对于这个问题,主要参考了该博主的题解使用图的思想分析该问题

代码
class Solution {
public:
	int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
		int len = gas.size();
		int spare = 0;//总剩余汽油量
		int minSpare = 9999999999;//最小的总剩余汽油量
		int minIndex = 0;//记录出发点
		for (int i=0;i<len;i++){
			spare += gas[i] - cost[i];
			if (spare<minSpare){
				minSpare = spare;
				minIndex = i;
			}
		}
		return spare < 0 ? -1 : (minIndex + 1) % len;//minIndex+1%len为出发点
	}
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值