C++实现LeetCode(134.加油站问题)

 更新时间:2021年07月27日 17:01:19   作者:Grandyang  
这篇文章主要介绍了C++实现LeetCode(134.加油站问题),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

[LeetCode] 134.Gas Station 加油站问题

There are N gas stations along a circular route, where the amount of gas at station i is gas[i].

You have a car with an unlimited gas tank and it costs cost[i] of gas to travel from station i to its next station (i+1). You begin the journey with an empty tank at one of the gas stations.

Return the starting gas station's index if you can travel around the circuit once, otherwise return -1.

Note:
The solution is guaranteed to be unique.

这道转圈加油问题不算很难,只要想通其中的原理就很简单。我们首先要知道能走完整个环的前提是gas的总量要大于cost的总量,这样才会有起点的存在。假设开始设置起点start = 0, 并从这里出发,如果当前的gas值大于cost值,就可以继续前进,此时到下一个站点,剩余的gas加上当前的gas再减去cost,看是否大于0,若大于0,则继续前进。当到达某一站点时,若这个值小于0了,则说明从起点到这个点中间的任何一个点都不能作为起点,则把起点设为下一个点,继续遍历。当遍历完整个环时,当前保存的起点即为所求。代码如下:

解法一:

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

我们也可以从后往前遍历,用一个变量mx来记录出现过的剩余油量的最大值,total记录当前剩余油量的值,start还是记录起点的位置。当total大于mx的时候,说明当前位置可以作为起点,更新start,并且更新mx。为啥呢?因为我们每次total加上的都是当前位置的油量减去消耗,如果这个差值大于0的话,说明当前位置可以当作起点,因为从当前位置到末尾都不会出现油量不够的情况,而一旦差值小于0的话,说明当前位置如果是起点的话,油量就不够,无法走完全程,所以我们不更新起点位置start。最后结束后我们还是看totoa是否大于等于0,如果其小于0的话,说明没有任何一个起点能走完全程,因为总油量都不够,参见代码如下:

解法二:

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

类似题目:

Reaching Points

Transform to Chessboard

Cheapest Flights Within K Stops

参考资料:

https://leetcode.com/problems/gas-station/discuss/42568/Share-some-of-my-ideas.

https://leetcode.com/problems/gas-station/discuss/42656/8ms-simple-O(n)-c++-solution

到此这篇关于C++实现LeetCode(134.加油站问题)的文章就介绍到这了,更多相关C++实现加油站问题内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于树莓派实现播放MP3音乐

    基于树莓派实现播放MP3音乐

    这篇文章主要为大家详细介绍了基于树莓派实现播放MP3音乐,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • opencv3/C++图像滤波实现方式

    opencv3/C++图像滤波实现方式

    今天小编就为大家分享一篇opencv3/C++图像滤波实现方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • C语言菜鸟基础教程之求1到100的和

    C语言菜鸟基础教程之求1到100的和

    在C语言中可以通过定义一个累加器(一个变量)并结合for循环来实现计算1到100之和。
    2017-10-10
  • VSCode C++多文件编译的简单使用方法

    VSCode C++多文件编译的简单使用方法

    这篇文章主要介绍了VSCode C++多文件编译的简单使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 详解C语言读取文件求某一列的平均值

    详解C语言读取文件求某一列的平均值

    本文粗浅比较了C语言中常用的几种读取文件的函数的效率,并给出了几段求取某列平均值的代码,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多度进步
    2022-02-02
  • C++中指针的引用*&的具体使用

    C++中指针的引用*&的具体使用

    本文主要介绍了C++中指针的引用*&的具体使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • C++类基本语法实例分析

    C++类基本语法实例分析

    这篇文章主要介绍了C++类基本语法实例分析,非常适合初学者学习借鉴,需要的朋友可以参考下
    2014-08-08
  • C语言职工信息管理系统源码

    C语言职工信息管理系统源码

    这篇文章主要为大家详细介绍了C语言职工信息管理系统源码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • C语言二叉排序树的创建,插入和删除

    C语言二叉排序树的创建,插入和删除

    本文主要介绍了Java实现二叉排序树的查找、插入、删除、遍历等内容。具有很好的参考价值,下面跟着小编一起来看下吧
    2021-10-10
  • C语言开发实现贪吃蛇小游戏

    C语言开发实现贪吃蛇小游戏

    这篇文章主要为大家详细介绍了C语言开发实现贪吃蛇小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10

最新评论