leetcode刷题日记——加油站

[ 题目描述 ]:
leetcode刷题日记——加油站_第1张图片
[ 思路 ]:

  • 题目要求求从哪个站开始出发,有足够的油能走完全程,如果存在这个站,则返回其位置,不存在返回-1
  • 暴力解法,按顺序,从每个站出发,查看其能否行驶一周
  • 代码如下,时间复杂度O(n2),空间复杂度O(1),但超出了题解时间限制
int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize) {
    int curgas,index;
    for(int i=0;i=0) return i;
    }
    return -1;
}
  • 另辟蹊径,究其本质就是不论从哪出发,能到行驶一圈的话,其汽油剩余量一定大于等于0,且其出发过程中的gas[i]-cost[i]必须一直一定大于等于0
  • 首先,计算出达到达下一站剩余的油量,然后计算出全体剩余油量
    • 全体油量小于0,则说明无法到达
    • 全体油量大于等于0,则说明最少有一点可以到达
  • 遍历下一站剩余油量数组,如果剩余油量和sum小于0,则出发点设置为下一站,
  • 运行如下
    leetcode刷题日记——加油站_第2张图片
int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize) {
    int sum=0,index=0;
    for(int i=0;i
  • 时间复杂度O(n),空间复杂度O(1)

[ 官方题解 ]:

  • 一、贪心算法,首先检查第 0 个加油站,并试图判断能否环绕一周;如果不能,就从第一个无法到达的加油站开始继续检查。
int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize) {
    int i = 0;
    while (i < gasSize) {
        int sumOfGas = 0, sumOfCost = 0;
        int cnt = 0;
        while (cnt < gasSize) {
            int j = (i + cnt) % gasSize;
            sumOfGas += gas[j];
            sumOfCost += cost[j];
            if (sumOfCost > sumOfGas) {
                break;
            }
            cnt++;
        }
        if (cnt == gasSize) {
            return i;
        } else {
            i = i + cnt + 1;
        }
    }
    return -1;
}

你可能感兴趣的:(刷题日记,面试经典150题,leetcode,算法,职场和发展)