134.Gas Station

题目链接

题目大意:一个circle圆环,第i个位置,有汽油gas[i],而汽车从i到i+1,需要汽油cost[i]。求解,从哪个位置开始,汽车能走完圆环。如果走不完则返回-1,能走完则返回index。例子如下:

法一:两个for循环。直接求解每个可能的起始位置,然后计算能否在有汽油的情况下,走完全环。o(n^2)。超时了。代码如下:

 1     public int canComplete(int[] gas, int[] cost) {
 2         int len = gas.length;
 3         int cnt = 0;
 4         int flag = 0;
 5         //逐一遍历每一种可能
 6         for(int i = 0; i < len; i++) {
 7             flag = 0;
 8             //对于每一个可能起始点,都计算一下circle能否完成汽车行驶任务
 9             for(int j = i; j < len; j++) {
10                 cnt += gas[j] - cost[j];
11                 if(cnt < 0 ) {
12                     cnt = 0;
13                     flag = -1;
14                     break;
15                 }
16             }
17             if(flag == -1) {
18                 continue;
19             }
20             for(int j = 0; j < i; j++) {
21                 cnt += gas[j] - cost[j];
22                 if(cnt < 0) {
23                     cnt = 0;
24                     flag = -1;
25                     break;
26                 }
27             }
28             if(flag == 0) {
29                 return i;
30             }
31         }
32         return -1;
33     }
View Code

法二(借鉴):贪心。待证明。具体见代码(耗时1ms):

 1     public int canComplete(int[] gas, int[] cost) {
 2         int gas_cnt = 0, cost_cnt = 0;
 3         int index = 0, cnt = 0;
 4         for(int i = 0; i < gas.length; i++) {
 5             //统计所有汽油数量
 6             gas_cnt += gas[i];
 7             //统计汽车行驶花费的所有汽油数量
 8             cost_cnt += cost[i];
 9             //统计到目前为止,汽油数量能否支撑汽车行驶
10             cnt += gas[i] - cost[i];
11             //如果一旦行驶不了,则从当前位置的下一个位置作为起始点
12             //原因:由于到现在都行驶不了,如果选择这个位置之前的任何一个位置作为起始点,汽油数量只会更少
13             //由于如果汽油数量>=花费数量,则一定存在解,所以所找到的解一定符合要求。
14             if(cnt < 0) {
15                 cnt = 0;
16                 index = i + 1;
17             }
18         }
19         //如果汽油数量<花费数量,则一定不存在解。
20         if(gas_cnt < cost_cnt) {
21             return -1;
22         }
23         return index;
24     }
View Code

 

posted on 2018-04-10 16:51  二十年后20  阅读(392)  评论(0编辑  收藏  举报

导航