当前位置:   article > 正文

leetcode gasstation_leetcode gasstation 分析

leetcode gasstation 分析


一圈加油站,每个加油站有一定量的油,从加油站i去加油站i+1会消耗一定的油。这两个数据分别存在数组gas和数组cost里,以gas[i]和cost[i]表示。

要求出从哪个加油站出发可以绕一圈。

看后面的讨论,大概问题是:绕一圈最后是回到原来的加油站吗?那是否可以倒着转呢?

绕一圈肯定是回到原来的加油站,不过倒着转还真没想到。。按照题意,从i到i+1的cost保存在数组里,那么从i+1到i的消耗是不是就是cost[i]?

而倒着转的答案就不一定和顺着的一样了。比如:gas:2,1,3,5 ; cost:4,2,2,3


思维惯性导致一直觉得需要对每个加油站遍历,但其实只用遍历一次就可以得到答案。试想:从1开到5,发现5过不去6,那么从2,3,4开到5当然也过不去,所以它们都不用试了。


我的代码的思路应该是最简单的了:

  1. class Solution {
  2. public:
  3. int canCompleteCircuit(vector<int> &gas, vector<int> &cost) {
  4. int sumgas = 0, sumcost = 0, n = gas.size();
  5. int i,j;
  6. for(i = 0; i < n; i++){
  7. sumgas += gas[i];
  8. sumcost += cost[i];
  9. }
  10. if(sumcost > sumgas)return -1;
  11. for(i = 0;i < n;){
  12. sumgas = 0; sumcost = 0;
  13. for(j = i; j<n+i;j++ ){
  14. int index = j%n;
  15. sumgas += gas[index];
  16. sumcost += cost[index];
  17. if(sumcost > sumgas){
  18. i = index + 1;
  19. break;
  20. }
  21. }
  22. if(j == n+i)return i;
  23. }
  24. return -1;//no use if guaranteed solution
  25. }
  26. };

当然还有一些人写得更简洁:

  1. class Solution {
  2. public:
  3. int canCompleteCircuit(vector<int> &gas, vector<int> &cost) {
  4. int start(0),total(0),tank(0);
  5. //if car fails at 'start', record the next station
  6. for(int i=0;i<gas.size();i++) if((tank=tank+gas[i]-cost[i])<0) {start=i+1;total+=tank;tank=0;}
  7. return (total+tank<0)? -1:start;
  8. }
  9. };


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/493541
推荐阅读
相关标签
  

闽ICP备14008679号