• LeetCode: Gas Station


    LeetCode: 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.

    地址:https://oj.leetcode.com/problems/gas-station/

    算法:一个简单粗暴的方法是,从第0个station开始试,看其是否可以绕一圈回到起点,这样的时间复杂度是$O(n^2)$,如果用这种方法那么肯定是会超时的(当时我也是用这个方法,下面这个巧妙的方法也是参考了网上的答案)。那么,下面我们介绍一种线性时间复杂度的算法,这个算法是对上面一种方法的改进。这个方法最核心的思想是基于如下的事实:假如从第0个station可以到达第$j=1,2,cdots,i-1$个station,但无法到达第i个station的话,那么从第$j=1,2,cdots,i-1$个station出发也肯定无法到达第i个station。原因很简单,假如可以从第j个station到达第i个station,那么我们可以先从第0个到达第j个,然后在从第j个到达第i个,也就是说我们可以从第0个到达第i个,故这个假设是不成立的。这样的话,当我们判断从第0个station无法到达第i个时,可以不用回过头从第1个station判断,我们可以直接继续从第i+1个station开始判断。由于题目说至少会存在一个解,也就是我们不需要去判断不存在解的情况,所以只要循环一遍就足够了。代码:

     1 class Solution {
     2 public:
     3     int canCompleteCircuit(vector<int> &gas, vector<int> &cost) {
     4         int n = gas.size();
     5         int sum_gas = 0, sum_cost = 0;
     6         for(int i = 0; i != n; ++i){
     7             sum_gas += gas[i];
     8             sum_cost += cost[i];
     9         }
    10        if (sum_cost > sum_gas){
    11            return -1;
    12        }
    13        sum_gas = 0;
    14        sum_cost = 0;
    15        int start = 0;
    16        for(int i = 0; i != n; ++i){
    17            sum_gas += gas[i];
    18            sum_cost += cost[i];
    19            if(sum_gas >= sum_cost){
    20                continue;
    21            }else{
    22                start = (i + 1) % n;
    23                sum_gas = 0;
    24                sum_cost = 0;
    25            }
    26        }
    27        return start;
    28     }
    29 };
  • 相关阅读:
    IOS中将十进制色值转换成UIColor
    WPF中让TextBlock每一个字符显示不同的颜色
    WPF中Application.Current的使用
    WPF中三种方法得到当前屏幕的宽和高
    WPF中的一些常用类型转换
    C#中日期时间的简单操作
    WPF中Image的Stretch属性
    WPF中的多点触摸事件
    SpringMV常用注解之@requestbody和@requestparam
    SpringMVC常用注解之@ModelAttribute
  • 原文地址:https://www.cnblogs.com/boostable/p/leetcode_gas_station.html
Copyright © 2020-2023  润新知