沿着循环路线有N个加油站,其中i站的天然气量是[i]。你有一辆带有无限气罐的汽车,并且它的费用是从i站到我的下一站(i + 1).如果您可以绕电路行驶一次,则返回起始站索引
2017-10-07 09:44
633 查看
本题源自LeetCode
=--------------------------------------------------------------------------------------
1 定一个起始站start
2 如果油量充足就向前走 end++ 否则就倒退一站。
3 记录每站的消耗,不浪费已经遍历过的
从尾开始
int canCompleteCircuit(vector<int> &gas, vector<int> &cost) {
int start=gas.size()-1;
int end=0;
int sum=gas[start]-cost[start];
while(start>end){
if(sum>=0){
//可以向前走
sum+=gas[end]-cost[end];
end++;
}else{
4000
start--;
sum+=gas[start]-cost[start];
}
}
return sum>=0 ? start:-1;
}
从头开始
int canCompleteCircuit(vector<int> &gas, vector<int> &cost) {
int len=gas.size();
int remain=0;
int sum=0;
int index=0;
for(int i=0;i<len;i++){
sum += gas[i]-cost[i];
remain += gas[i]-cost[i];
if(remain<0){
//表示这站到不了下一站,则结果可能是下一站
index=i+1;
remain=0;
}
}
return sum>=0 ? index:-1;
}
=--------------------------------------------------------------------------------------
1 定一个起始站start
2 如果油量充足就向前走 end++ 否则就倒退一站。
3 记录每站的消耗,不浪费已经遍历过的
从尾开始
int canCompleteCircuit(vector<int> &gas, vector<int> &cost) {
int start=gas.size()-1;
int end=0;
int sum=gas[start]-cost[start];
while(start>end){
if(sum>=0){
//可以向前走
sum+=gas[end]-cost[end];
end++;
}else{
4000
start--;
sum+=gas[start]-cost[start];
}
}
return sum>=0 ? start:-1;
}
从头开始
int canCompleteCircuit(vector<int> &gas, vector<int> &cost) {
int len=gas.size();
int remain=0;
int sum=0;
int index=0;
for(int i=0;i<len;i++){
sum += gas[i]-cost[i];
remain += gas[i]-cost[i];
if(remain<0){
//表示这站到不了下一站,则结果可能是下一站
index=i+1;
remain=0;
}
}
return sum>=0 ? index:-1;
}
相关文章推荐
- PHP 有n 个长为m+1 的字符串, 如果某个字符串的最后m 个字符与某个字符串的前m 个字符匹配,则两个字符串可以联接, 问这n 个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误
- 有n个长为m+1的字符串, 如果某个字符串的最后m个字符与某个字符串的前m个字符匹配,则两个字符串可以联接, 问这n个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误。
- 给定一个整数数组,两个数字的返回索引将它们加到一个特定的目标中。 您可以假设每个输入都只有一个解决方案,并且您可能不会两次使用相同的元素。
- 有n 个长为m+1 的字符串,如果某个字符串的最后m 个字符与某个字符串的前m 个字符匹配,则两个字符串可以联接,问这n 个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误
- 有n个长为m+1的字符串,如果某个字符串的最后m个字符与某个字符串的前m个字符匹配,则两个字符串可以联接,问这n个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误。
- 打印不同的数(编写一个程序,使用指针访问数组方式,读入十个数,输出其中不同的数,即一个数如果出现多次,只打印一次)
- 短信一次发送字节140个,如果超过140字节就会分为两条。这时如果第140个字节是中文的前半,那么第一条短信应该发送139字节。设计一个程序,读取原始信息,可以根据长度自动拆分信息转换为多条短信
- getchar()函数的返回值赋给char型,用if(ch=getchar() != EOF)测试,输入ctrl+z同样可以结束循环的分析
- 独木舟上的旅行 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别。一条独木舟最多只能乘坐两个人,且乘客的总
- java-第三章-使用if选择结构实现,如果年龄够5岁并且是男,可以搬桌子
- Android广告图片轮播控件,支持无限循环和5种主题,可以灵活设置轮播样式、时间、位置、图片加载框架等!
- 已知一个3 * 3矩阵,求对角线元素的和,并且中间的只可以加一次
- 利用DataView.ToTable 方法 (String) 在结果中查询,可以实现无限次循环
- 根据后台循环的数据动态弹出提示框,并且实现带有遮蔽层
- 阿里巴巴面试算法题:有一个函数int getNum(),每运行一次可以从一个数组V[N]里面取出一个数,N未知,当数取完的时候,函数返回NULL。现在要求写一个函数int get(),这个函数运行一次可以从V[N]里随机取出一个数,而这个数必须是符合1/N
- 已知一个几乎有序的数组,几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离可以不超过k,并且k相对于数组来说比较小。请选择一个合适的排序算法针对这个数据进行排序。 给定一个int数组A,同时给定
- Intellij idea导出带有main方法的jar包,并且可以执行的方法!
- Java-第三章-使用if选择结构实现,如果年龄够7岁或5岁并且是男,可以搬桌子
- 每天学习一算法系列(25)(一个台阶总共有n 级,如果一次可以跳1 级,也可以跳2 级,求总共有多少总跳法,并分析算法的时间复杂度。)
- 返回JSON出现Infinite recursion无限循环错误的解决