码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode-Gas Station-134

时间:2016-08-31 15:36:51      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:

输入两个数组,gas[i]表示在i位置能加的油,cost[i]表示在i位置到i+1位置消耗的油,这n个位置围成一个圈,求是否存在从某一点出发能走完全程

第一想法是贪心,先处理处gas[i]/cost[i],然后从这个比值最大的点开始走,但找到反例:(5,4),(6,4),(5,5),(4,7),按刚才思路应该从第二个点开始走,但是走不到第四个点,所以贪心的出发点是错误的,不应该以每个点的性价比考虑,而应该按照整体来考虑:出发的前段时间尽可能选择加油比消耗大的存储尽可能多的油,用于后面消耗,也就是先尽可能的存储油

所以先处理diff[i]=gas[i]-cost[i],记录每个点能存储的油,如果sum(diff[i])<0 说明整体的存储小于0,肯定不能走完,return -1

否则找到最大和连续子序列的开头就是所求

 1 class Solution {
 2 public:
 3     int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
 4         if(gas.size()==0) return 0;
 5         vector<int> diff;
 6         int sum=0;
 7         for(int i=0;i<gas.size();i++){
 8             diff.push_back(gas[i]-cost[i]);
 9             sum+=diff.back();
10         }
11         if(sum<0) return -1;
12         int cur=diff[0];
13         int indx=0;
14         for(int i=1;i<diff.size();i++){
15             if(cur<0){
16                 cur=0;
17                 indx=i;
18             }
19             cur+=diff[i];
20         }
21         //if(cur<0) return -1;
22         return indx;
23     }
24 };

 

leetcode-Gas Station-134

标签:

原文地址:http://www.cnblogs.com/0summer/p/5825682.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!