leetcode-134. Gas Station

来源:互联网 发布:淘宝网天猫商城家俱 编辑:程序博客网 时间:2024/05/17 22:27

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[i]```,然后你开一辆车,从某一个加油站出发,看看能否绕一圈,从一个加油站到下一个加油站需要的油量是‘’‘cost[i]’‘’。如果可以的话,就返回出发的那个加油站的下标```i```,不行的话就返回-1。

答案假定是唯一的。

首先按照正常思路可以想到一个暴力解决的方法,就是去循环遍历每个结点,试着环绕一圈,代码如下:

public class Solution {    public int canCompleteCircuit(int[] gas, int[] cost) {        for(int i = 0; i < gas.length; i++){            int currentGas = gas[i];            int j = i;            while(currentGas >= cost[j]){                //能够到达下一站                currentGas -= cost[j];                j = (j+1) % gas.length;                if(j == i){                    return i;                }                currentGas += gas[j];            }        }        return -1;    }}
上述代码复杂度O(n^2),思路简单清晰,然而,难度是Medium的题目怎么可能就这么解决呢?

提交代码,超时了。很尴尬,只能想一些巧妙的方法。

这里应该这么想,想要完成全程其实只要满足两个条件即可,第一个是,所有的gas和大于cost和。第二个就是,当前油量可以到达下一站。第二个条件的实现有点抽象,我会在代码里解释,并在后面给出更详细的说明,代码如下:

public class Solution {    public int canCompleteCircuit(int[] gas, int[] cost) {        int sum = 0;        int total = 0;        int j = 0;        for(int i = 0; i < gas.length; i++){            sum += gas[i] - cost[i];            total += gas[i] - cost[i];            if(sum < 0){                //说明此时汽车无法到达下一站,所以之前所有的i包括当前i都不能作为起点。起点只可能是后面的某个值                j = i + 1;                sum = 0;            }        }        if(total >= 0){            return j;        }else{            return -1;        }    }}
这个算法用total来表示总油量是足够支持到下一站的,sum则表示能不能到达下一站,可以证明:如果```gas[i] >= cost[i]```,则可以出发,并且带有储存油量,如果一直保持了```gas[i] >= cost[i]```这个条件,则说明储存的油量是在不断增加的,所以如果某一次出现```currestGas + gas[i] < cost[i]```,不仅说明不能从这一站出发,还说明了不能从之前的任一站出发。所以就先假定下一站是可以出发的。


代码复杂度是O(n),运行时间也只有1ms,已经是最优算法了,至于前面的0ms,大概是以前的数据或者是在服务器性能极好的时候进行了提交,导致时间短到离谱。

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 我的世界字体变大了怎么办 生锈的铁钉扎了怎么办 每天晚上窗纱上老有蝙蝠倒挂怎么办 我的世界没有痒怎么办 七日杀被ban了怎么办 吕框箱子上保护摸撕不掉怎么办 我的世界开光影卡怎么办 我的世界买不了怎么办 我的世界延迟高怎么办 我的世界过于昂贵怎么办 白色麻布染上别的颜色怎么办 印度老山檀香开裂了怎么办 专升本没过线怎么办 西安公租房小孩上学怎么办 全民k歌直播没人怎么办 在全民直播没人看怎么办 皮肤又黄又粗怎么办 被强制消费后应怎么办? 当保安不发工资怎么办? 辅警改革流管员怎么办 退伍证上照片毁了怎么办 辅警年龄大了怎么办 交警2小时不出警怎么办 中暑发烧39度了怎么办 中暑头疼怎么办最快最有效 十五个月的宝宝拉肚子怎么办 中暑了头疼想吐怎么办 2周岁中暑了呕吐怎么办 容易中暑的人该怎么办 喷泡3m反光脏了怎么办 新摩托车被交警查到怎么办 写字楼保安夜班巡逻害怕怎么办 全民k歌歌曲删了怎么办 莲藕洞里的黑膜怎么办 鞋子后面的拉链磨脚怎么办 磨砂鞋尖踢掉皮怎么办 塔吊吊装过程中遇到障碍物怎么办 高速路上突然遇到障碍物怎么办 被不明物蛰了怎么办 喝酒后开车撞路政护栏怎么办 电脑过了质保期怎么办