Boostable

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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 };

 

posted on 2014-08-23 18:36  Boostable  阅读(278)  评论(0编辑  收藏  举报