暴力方法

暴力的方法很明显就是O(n^2)的,遍历每一个加油站为起点的情况,模拟一圈。

如果跑了一圈,中途没有断油,而且最后油量大于等于0,说明这个起点是ok的。

暴力的方法思路比较简单,但代码写起来也不是很容易,关键是要模拟跑一圈的过程。

「for循环适合模拟从头到尾的遍历,而while循环适合模拟环形遍历,要善于使用while!」

时间复杂度O(n^2)
空间复杂度O(n)
class Solution {public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {for (int i = 0; i < cost.size(); i++) {int rest = gas[i] - cost[i]; // 记录剩余油量int index = (i + 1) % cost.size();while (rest > 0 && index != i) { // 模拟以i为起点行驶一圈rest += gas[index] - cost[index];index = (index + 1) % cost.size();}// 如果以i为起点跑一圈,剩余油量>=0,返回该起始位置if (rest >= 0 && index == i) return i;}return -1;}
};

贪心解法

首先如果总油量减去总消耗大于等于零那么一定可以跑完一圈,说明各个站点的加油站 剩油量rest[i]相加最后一定是大于等于零的。

每个加油站的剩余量rest[i]为gas[i] - cost[i]。(通俗点,就是说我在当前加油站加gas[i]升油,去往下一个加油站要消耗掉cost[i]升油,那么我还可以剩余res[i]升油。)

i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明剩余的油不够到达下一个加油站了,进而证明[0, i]区间都不能作为起始位置,起始位置从i+1算起,再从0计算curSum。


「那么局部最优:当前累加rest[j]的和curSum一旦小于0,起始位置至少要是j+1,因为从j开始一定不行。全局最优:找到可以跑一圈的起始位置」。

时间复杂度:O(n)
空间复杂度:O(1)
class Solution {public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int curSum = 0;  //统计当前油桶剩余油量,若小于0,说明从当前加油站不能到达下一加油站了,必须更改起始点。int totalSum = 0;//统计从0开始到结束位置总剩余油量,最后发现<0,说明一定不能跑完一圈。int start = 0;for (int i = 0; i < gas.size(); i++) {curSum += gas[i] - cost[i];  totalSum += gas[i] - cost[i];if (curSum < 0) {   // 当前累加rest[i]和 curSum一旦小于0start = i + 1;  // 起始位置更新为i+1curSum = 0;     // curSum从0开始}}if (totalSum < 0) return -1; // 说明怎么走都不可能跑一圈了return start;}
};

加油站(暴力+贪心)相关推荐

  1. leetcode53. 最大子数组和(暴力+贪心)

    一:论语 追求利益的同时 我们需要控制度 就好比鹅厂的王者荣耀 赚的盆满钵满 坑坏了多少青少年 但是鹅厂早已经开始控制度了 二:题目 三:上码(暴力+贪心) 1:暴力 class Solution { ...

  2. HDU 2681 MM Programming Club(miaos的线段树维护+ycy的暴力贪心)

    Description ACM is popular in HDU. Many girls want to learn more about programming skills in ACM. As ...

  3. 134. 加油站(贪心算法)

    在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升. 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升.你从其中的一个加 ...

  4. LeetCode 670 最大交换 (暴力+贪心、Python)

    同个人网站 https://www.serendipper-x.cn/,欢迎访问 ! 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/maxim ...

  5. 加油站问题-贪心算法(面试题JS)

    一辆汽车加满油后可行驶n公里.旅途中有若干个加油站.设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少.对于给定的n(n <= 5000)和k(k <= 1000)个加油站位 ...

  6. Codeforces 913 二进制背包(柠檬水) 暴力贪心特殊背包(选题)

    A B C 给你N(N<=30)种水瓶每种水瓶有无限个 每个的体积是2^(i-1)价格是cost[i] 要求你花最少的钱弄出L体积的水 先从前到后扫一遍cost[i+1]=min(cost[i+ ...

  7. LeetCode 134. 加油站(贪心)

    文章目录 1. 题目 2. 解题 1. 题目 在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升. 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要 ...

  8. 算法09——patA1033 加油站问题(贪心)

    问题描述:   已知起点与终点的距离为D,油箱的最大油量为Cmax,单位汽油能够支持前进Davg,给定N个加油站的单位油价和离起点的距离(所有加油站都在一条线上),汽车初始时刻处于起点位置,油箱为空, ...

  9. 问题 B: 加油站(贪心+模拟)

    Problem Link:http://139.129.36.234/problem.php?cid=1015&pid=1 问题 B: 加油站 时间限制: 1 Sec  内存限制: 128 M ...

最新文章

  1. [spring-boot] 多环境配置
  2. lua java 性能比较_Lua coroutine vs Java wait/notify
  3. 5300亿参数,SOTA屠榜!最大NLP预训练模型新王登基,微软英伟达联手称霸
  4. 皮一皮:现在的妹子这么好骗?还是在下脸皮太薄了...
  5. 2019区块链广泛应用于能源领域 ,DMA基金会,服务于区块链产业
  6. java 字符正则匹配算法_算法之字符串——正则表达式匹配
  7. 案例:6 种 A / B 测试成功培养用户使用习惯
  8. sigterm信号_Golang之信号处理(Signal)
  9. 数论 - 算数基本定理的运用 --- nefu 118 : n!后面有多少个0
  10. 老男孩Linux Crond定时任务练习题
  11. XSS CSRF 攻击
  12. 阿里2015回顾面试招收学历(获得成功offer)
  13. 从nginx访问日志中的400错误说起
  14. 斐讯路由器k3c虚拟服务器,斐讯K3C路由器32.1.26.175如何打开telnet升级到官改固件教程...
  15. blackberry 9630CDMA写号教程
  16. 【计算机系统基础】- 袁春风
  17. 使用minidwep-gtk
  18. iPhoneXSM屏幕适配、 各机型的逻辑分辨率
  19. 留不下的城市,回不去的家乡,真得么?
  20. 一般测试流程 常用的软件测试工具有哪些? 开源测试工具 软件测试一般用到的工具、框架、技术列表

热门文章

  1. Visual Stdio的解决方案资源管理器位置调整
  2. JSON自动生成相关类
  3. 演练:创建和使用静态库 (C++)
  4. 在log4j中使用自定义的Appender
  5. 十进制转二进制、二进制转十进制
  6. NFS文件系统简介及原理
  7. Swift之深入解析反射Mirror与错误处理
  8. 面试题 17.12. BiNode
  9. 2019年第十届蓝桥杯 - 省赛 - C/C++大学B组 - H. 等差数列
  10. Python视频编辑库:MoviePy