Leetcode 134. 加油站

题目

在这里插入图片描述
Leetcode 134. 加油站

代码(7.27 首刷看解析)

一开始暴力,for套while,复杂度n2,超了。。。
我寻思官方的题解不也是n2吗?搞不懂。

思路:从头遍历一遍,如果 总油量-总消耗量 为负,说明无法绕圈(因为从任意点出发绕一圈的总油量-总消耗量都相等)。 否则从遍历一遍中,累计油量-累计消耗量的最低点出发——这样保证从这个出发点回到这个出发点的过程中,累计油量-累计消耗量>总油量-总消耗量恒成立。
在这里插入图片描述

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int n = gas.size();    
        int bottom = 0, sum = 0, startid = -1;
        for(int i = 0; i < n; i++) {
            sum += gas[i] - cost[i];
            if(sum < bottom) {  // 说明前面都是在消耗
                bottom = sum;
                startid = i;
            }
        }
        if(sum < 0) return -1;
        return startid+1;
    }
};

代码(9.12 二刷看解析)

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int sum = 0, bottom = 0;
        int index = -1;
        for(int i = 0; i < gas.size(); i++) {
            sum += gas[i]-cost[i];
            if(sum < bottom) {
                bottom = sum;
                index = i;
            }
        }
        if(sum < 0)
            return -1;
        return index+1;
    }
};

代码(9.29 三刷自解)

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int index = -1;
        int ans = 0, cur = 0;
        int sum = 0;
        for(int i = 0; i < gas.size(); i++) {
            cur = cur + gas[i]-cost[i];
            if(cur < ans) {
                ans = cur;
                index = i;
            }
        }
        return cur < 0 ? -1 : index+1;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值