1.在做pat的to fill or not to fill的时候想起同样是加油站的题目,于是翻出来复习一下

2.关键在于理解潜在的条件。假设油量为tank,如果到了当前站i,tank<0,即不能到达站i+1,那么起始站start和i之间的任何一个站i都不能到达站i+1。因为每个站至少贡献了0或者>0的油量,去掉一个站,那么tank必然比现在的油量还要小,所以更加不可能达到i+1.

证明:

设tank[a,b]是指以a为起始站,到达b站后,油箱的油量。

如果上述2结论不成立,则可以推导出,在start与i之间的某一个站j,使得tank[j,i]>tank[start,i],又tank[start,i]=tank[start,j]+tank[j,i],那么推得tank[start,j]<0,

而车能够从start走到i,所以对于任意k属于[start,i],均有tank[start,k]>=0,与tank[start,j]<0矛盾,所以2结论是正确的。

AC代码:

class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int tank=0;//当前的油箱油量
int start=0;//从第0个站开始计算,后面也作为结果进行返回
int n=gas.size();
for(int i=0;i<gas.size();i++)
{//遍历所有加油站
tank+=gas[(i+start)%n]-cost[(i+start)%n];//更新油箱的油量
if(tank<0)
{//如果tank小于0,表明没办法从i走到下一个油站,那么start直接从下一站开始
//如果无法从start达到i,那么start和i之间任何一个站都不能达到i,因为每个站至少贡献了0和>=0的油量
start=i+start+1;//start从当前i站的下一个站开始
i=-1;//使得下次从i=0开始
if(start>=n)
{//已经把所有情况都遍历了,仍不能满足要求
return -1;
}
tank=0;
}
}
return start;
}
};

之前的AC代码:

class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int tank=0;
int start=0;
int n=gas.size();
for(int i=0;i<n+start;i++)
{
tank=tank+gas[i%n]-cost[i%n];
if(tank<0)
{//如果油箱汽油小于0,则不能到达,即从start无法到达i,start与i之间的任何一站都不可能达到i
//因为从start到i这个过程中,每一站至少贡献0的油量,假设去掉start,则tank会减去0或者一个正数,导致更加不可能到达i
start=i+1;//从下一个站继续开始重新计算
if(start>=n)//如果下一个站已经超过了n,证明前n个站都不可能完成循环,所以return-1
return -1;
tank=0;
}
}
return start;//如果循环结束后tank大于等于0,则能够达到目的地
}
};

最新文章

  1. 关于javascript中限定时间内防止按钮重复点击的思路
  2. 电脑重装系统后如何恢复Mysql数据库
  3. Python体验(09)-图形界面之Pannel和Sizer
  4. otter双主同步安装与配置
  5. C++之友元
  6. C#读取XML文件的基类实现
  7. html css js 一些记录.
  8. R 中同步进行的多组比较的包:npmc
  9. kettle 数据库连接中断重置
  10. String 两种实例化方式的区别
  11. input单选框全选与反选
  12. 开始lisp的旅程
  13. 【剑指offer】面试题44:扑克牌的顺子
  14. 关于java的环境变量的一点总结
  15. cocos2d-x 贝塞尔曲线的简单运用(CCBezierTo,CCBezierBy)
  16. vue组件,撸第一个
  17. Shell脚本中让进程休眠的方法(sleep用法)
  18. java 集合之实现类ArrayList 和 LinkedList
  19. Python全栈之路----目录
  20. java框架之Struts2(3)-OGNL&amp;ValueStack

热门文章

  1. PHP的一个小tips (关于=和==或者===的使用)
  2. 元祖&amp;字典
  3. Python—程序设计:单例模式
  4. JavaScript学习总结(七)
  5. 关于Java编码规范
  6. 5. react 基础 - 组件拆分 和 组件传值
  7. android中shape的使用(android:angle小解)
  8. WINSCP 使用笔记
  9. 计蒜客 密码锁(BFS)
  10. 如何在Foxwell NT650 OBD2扫描仪上查看实时PID数据?