LeetCode 贪心算法 134加油站

题⽬链接:https://leetcode-cn.com/problems/gas-station/
在⼀条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
你有⼀辆油箱容量⽆限的的汽⻋,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的⼀个加
油站出发,开始时油箱为空。
如果你可以绕环路⾏驶⼀周,则返回出发时加油站的编号,否则返回 -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 升汽油
总结
贪⼼算法:加油站
134. 加油站
如果题⽬有解,该答案即为唯⼀答案。
输⼊数组均为⾮空数组,且⻓度相同。
输⼊数组中的元素均为⾮负数。
开往 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 升汽油。
因此,⽆论怎样,你都不可能绕环路⾏驶⼀周。

思考:这题显然尽量不能用O(n^2)的思路走,那么可以试试这么干
首先,gas和cost是决定开不开的关键,获取一个差值数组,如果小于零那些点就pass
其次,剩下的点如果是起始点,那么开完一圈的值肯定会>0,中间也必须是sum不然开不了,那么开始累积sum,如果出现小于零必定不是起始点
但是如果直接写了就会过不了。所以要做一点改进
class Solution:
def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
result=[]
for i in range(0,len(gas)):
result.append(gas[i]-cost[i])
if sum(result)<0:
return -1
else:
index=-1
oil=0
for i in range(0,len(result)):
oil=oil+result[i]
if result[i]<0:
if oil<0 and result[i]+result[(i-1+len(result))%len(result)]<0:
index=-1
elif result[i]>=0 and index==-1:
index=i
return index

因为点前面的sum就算<0,还是会出现走完全部sum正好等于零,这时只要保证起点的后一个点减去前一个>0,就确定可以走,那么就过了
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值