前言
每天和你一起刷 LeetCode 每日一题~
大家国庆节快乐呀~
LeetCode 启动!
国庆第 6 天,在加油站 . . .
题目:加油站
代码与解题思路
今天这道题目是力扣上的经典贪心(第 134 题)
func canCompleteCircuit(gas []int, cost []int) int {
// 如果存在解,则 保证 它是 唯一 的
// 题目要求我们从任意一个 gas 站出发,绕行一周
// 如果能成功,那就返回出发点,如果不能成功就返回 -1,且必定有解
// 这样意味着,只有两种情况,一种是 sum(gas) < sum(cost) 返回 -1
// 第二种 sum(gas) >= sum(cost),找到出发的加油站的编号
curGas := 0 // 记录当前油箱里面的油
start := 0 // 记录出发的加油站编号
allGas, allCost := 0, 0 // 记录当前增加/花费的油量
for i := 0; i < len(gas); i++ { // 遍历所有加油站
allGas += gas[i]
allCost += cost[i]
curGas += gas[i] - cost[i]
if curGas < 0 { // 假设当前油量为负,那就从下一站作为起始重新试试
start = i + 1 // 从下一站开始
curGas = 0 // 清空当前的油箱,重新开始
}
}
if allCost > allGas { // sum(gas) < sum(cost) 返回 -1
return -1
}
return start // sum(gas) >= sum(cost) 返回出发的加油站的编号
}
思路如注释
这道题能贪的核心在于,题目说:必定有解,这样就只存在两种情况,可以比较轻松的进行分类讨论
1、sum(gas) < sum(cost)
也就是加油的总和比消耗油的总和要小,那无论我们从哪一站开始,都必定会失败,油箱不可能够用
2、sum(gas) >= sum(cost)
加油的总和大于等于消耗的油量总数,这里有个必须要想明白的核心点:为什么这种情况必定有解?
可以尝试在样例一模拟一下,随机排布加油站和消耗油量的元素的位置,你会发现,必定能找到一个能够成功的起始点。
可能这个解释不太够完美,没办法,我数学不好,做贪心题目一般只能靠脑内模拟+经验,证明 . . . 暂时能力不够。
视频实况
【【LeetCode】每日一题 2024_10_6 加油站(贪心)】
每天进步一点点
可以和我刷一辈子的每日一题吗?
一题一题,积累起来就是一辈子。