[leetcode] 134. Gas Station (medium)

本文探讨了一个经典的算法问题:循环加油站。问题要求判断一辆车是否能从一个循环的加油站出发,通过加油并消耗油料到达起点完成一圈。文章提供了两种解决方案,一种是遍历法,另一种则是更简洁的方法。首先检查总油量是否大于总消耗量,然后通过逆序遍历寻找可能的起始加油站。

原题
题意:
过一个循环的加油站,每个加油站可以加一定数量的油,走到下一个加油站需要消耗一定数量的油,判断能否走一圈。

思路:
一开始思路就是遍历一圈,最直接的思路。

class Solution
{
  public:
    int canCompleteCircuit(vector<int> &gas, vector<int> &cost)
    {
        int beg = 0;
        int tank = 0;
        int n = gas.size();
        int sumGas = 0, sumCost = 0;
        for (auto a : gas)
            sumGas += a;
        for (auto a : cost)
            sumCost += a;

        if (sumGas < sumCost)
        {
            return -1;
        }

        for (int i = 0; i < n; i++)
        {
            tank += gas[i];

            if (tank >= cost[i])
            {
                tank -= cost[i];
            }
            else
            {
                beg = i + 1;
                tank = 0;
            }
        }
        return beg;
    }
};

看到别人的题解,很简洁。

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

转载于:https://www.cnblogs.com/ruoh3kou/p/9893426.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值