LeetCode|134. 加油站(day5)

作者:MJ昊

博客:掘金CSDN

公众号:程序猿的编程之路

今天是 昊 的算法之路第5天,今天分享的是LeetCode第134题加油站的解题思路。这道题目虽然难度为中等,但通过优化的贪心算法可以高效解决问题。

题目描述简要回顾

你需要从一个加油站出发,按顺序经过所有加油站并返回起点。如果有足够的汽油完成这趟旅程,返回起始加油站的编号;否则,返回-1

解题思路

这道题可以通过贪心算法来解决,关键在于找到一个合适的出发点,让从这个点出发能够完成整圈的环路行驶。我们需要通过两个基本原则来理解:

  1. 局部判断: 每次如果到达某个加油站时发现汽油不足以开到下一个站,那么从当前加油站或之前的加油站出发都是行不通的。因此可以直接跳过这段区间。
  2. 全局判断: 如果从某个加油站起始能走完整圈,那么在这个站之前的所有加油站都不能作为起始站。

代码实现:

var canCompleteCircuit = function(gas, cost) {
    const n = gas.length;
    let i = 0;
    while (i < n) {
        let sumOfGas = 0, sumOfCost = 0;
        let cnt = 0;
        while (cnt < n) {
            const j = (i + cnt) % n;// 模拟环路
            sumOfGas += gas[j];// 当前获得的汽油
            sumOfCost += cost[j];// 当前消耗的汽油
            if (sumOfCost > sumOfGas) {
                break;// 无法继续前进,跳出循环
            }
            cnt++;
        }
        if (cnt === n) {
            return i; // 找到了合适的起始点
        } else {
            i = i + cnt + 1; // 跳过无法行驶的区间
        }
    }
    return -1; // 无法找到合适的起点
};

复杂度分析

  • 时间复杂度:O(n),每个加油站最多被访问两次,一次是作为可能的起点,一次是跳过无法继续的区间。
  • 空间复杂度:O(1),只使用了常数的额外空间。

总结

通过贪心策略,我们可以在O(n)时间内高效解决这个问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值